Как безопасно записывать массив от юзера в БД

Зачем велосипед придумывать?

Все что приходит от пользователя оборачиваем Для просмотра ссылки Войди или Зарегистрируйся и пишем в БД.
 
Зачем велосипед придумывать?

Все что приходит от пользователя оборачиваем Для просмотра ссылки Войди или Зарегистрируйся и пишем в БД.

serialize не экранирует кавычки и не защитит от sql-запросов...

PHP:
$string = '`\'union select"';
echo $string , "\r\n";

var_dump(serialize($string));

Можно конечно сериализированную строку потом в dase64 загнать - вот это уже будет получше защита. Но это только защита записи, а вот при распаковке такой строки тоже надо аккуратность проявить...
 
  • Заблокирован
  • #13
Да вы пьяные все чтоль? Один регулярку, другой сериализацию предлагает. Очнитесь, люди! Стандартная, обязательная(!), функция для 'безопасной'(до безопасности ещё далеко) записи в БД любых данных, поступающих откуда-то извне это Для просмотра ссылки Войди или Зарегистрируйся(для mysqli). Без неё вообще никуда. Я совершенно не понимаю почему её так редко используют(ума не хватает чтоль?:D ) и почему на этом форуме больше одной страницы о ней не было слышно. А тему вообще прикрепить советую. Ибо это больная тема для каждого.
P.S.: Нужно не что-то запрещать, а наоборот что-то отдельное только разрешать. Например для числовых значений "SELECT * FROM test WHERE id = ".(int)$_GET['id'];
 
По-моему здесь просто было важно более четко определить, что тебе нужно. Если от пользователя нужен массив именно ЧИСЕЛ, то проверяешь каждый элемент массива на соответствие числовому типу. Дальше как желаешь, либо дать юзеру сообщение о том, что введено что-то некорректно (я бы так и сделал), либо просто отбросить в введеной строке все, кроме чисел. Можно предварительно делать trim(), на случай если юзер ставит парочку пробелов. Как только получишь чистый, "безопасный" массив, делаешь implode() и записываешь строчку в БД.

mysqli_real_escape_string() можно юзать для строк. Если хочешь иметь в базе только числа, то надо изначально делать так, чтобы туда попадали только числа.
 
Да вы пьяные все чтоль? Один регулярку, другой сериализацию предлагает. Очнитесь, люди! Стандартная, обязательная(!), функция для 'безопасной'(до безопасности ещё далеко) записи в БД любых данных, поступающих откуда-то извне это Для просмотра ссылки Войди или Зарегистрируйся(для mysqli). Без неё вообще никуда. Я совершенно не понимаю почему её так редко используют(ума не хватает чтоль?:D ) и почему на этом форуме больше одной страницы о ней не было слышно. А тему вообще прикрепить советую. Ибо это больная тема для каждого.
P.S.: Нужно не что-то запрещать, а наоборот что-то отдельное только разрешать. Например для числовых значений "SELECT * FROM test WHERE id = ".(int)$_GET['id'];

Ты задачу прочитал внимательно? От пользователя приходит массив! Попробуй сделай mysqli_real_escape_string($array) и вот так сразу запихни в поле таблицы. Расскажешь что у тебя получилось :)

serialize не экранирует кавычки и не защитит от sql-запросов...
...
Можно конечно сериализированную строку потом в dase64 загнать - вот это уже будет получше защита. Но это только защита записи, а вот при распаковке такой строки тоже надо аккуратность проявить...

А чем плохо сериализовать и экранировать?
 
  • Заблокирован
  • #16
Ты задачу прочитал внимательно? От пользователя приходит массив! Попробуй сделай mysqli_real_escape_string($array) и вот так сразу запихни в поле таблицы. Расскажешь что у тебя получилось :)
а по-моему ты его не прочитал.
С помощью ф-ции implode(",", $data["selects"]) из массива делается строка и пишется в БД.
 
а по-моему ты его не прочитал.

Ну да, да...

С помощью ф-ции implode(",", $data["selects"]) из массива делается строка и пишется в БД.

Вот как раз на это выражение я и дал комментарий. Представим если от пользователя пришел массив:

Код:
$data["selects"] = array("1,35", "1,65")

После implode(",", $data["selects"]) мы получили строку и записали в поле таблицы "1,35,1,65". Теперь нам нужно получить данные, что-то мне подсказывает что это будет выглядеть так: explode(",", "1,35,1,65"). И что мы получили? Сравните с исходными данными!
 
  • Заблокирован
  • #18
Для просмотра ссылки Войди или Зарегистрируйся, ну дык а кто заставляет в качестве дилиметера запятую юзать?
Ой, чую забанят меня за флуд)
 
Если просто массив записать полностью (не по столбцам в базе а в один столбец) то проще будет так:
mysql_real_escape_string(serialize($data))

и лучше сделать рекурсивную проверку массива, и просто изначально делать $array[$key] = (int)$value;
 
Назад
Сверху