| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Безопасно ли? |
| Автор: zluka 11.3.2009, 14:15 | ||
Вот простой вывод статьи из БД:
Достаточна ли защита от SQL-инъекции? |
| Автор: pizzz 11.3.2009, 14:27 | ||||
Так не надо. Надо:
|
| Автор: bars80080 11.3.2009, 14:29 |
| после intval смысла в mysql_real_escape_string нет |
| Автор: pizzz 11.3.2009, 14:32 | ||||
ТО есть если ид строка. То получиться 1. Хотя запросили строку..... Проше сделать так:
Добавлено через 58 секунд Голова болит... Заболел... Могу ошибаться..... |
| Автор: NewDima 11.3.2009, 16:41 | ||
| и в конце вернулись к той же инъекции... если $_GET['id'] - строка не число, то выражение
всегда вернет истину а потому в $_GET['id'] может быть и "1' UNION ..." или "1' OR 1=1" поправьте, если ошибаюсь Добавлено @ 16:44 я бы использовал is_int, заодно можно хоть узнать, че нам пытаются впихать в запрос и анализировать в логах потом |
| Автор: O_c0der 11.3.2009, 20:56 | ||
100% защита от атаки sql-injection |
| Автор: SneG0K 11.3.2009, 21:21 |
| O_c0der, и что ты изменил? Барс все сказал... Если извращать по конкретному, то регулярками и на пустоту... Хотя вполне хватит и преобразования в INT... Хотя!, на сколько мне известно что строка 1a, после преобразования к Integer, становится 1. Ну в принципе логично. НО, в параметре уже левая буква завелась, что уже значит о наличии неправильных данных и хотя в большинстве случаев мускуль вернет значение по ID, я считаю, что стоит проверять на всякое лишнее... Если программа функциклирует правильно, то левым данным в ссылке браться неоткуда... Хотя это мое мнение. |
| Автор: zluka 11.3.2009, 21:29 | ||
Спасибо, где целочисельный параметр я уже разобрался, а от как быть если параметр строковый:
Использовать только mysql_real_escape_string? |
| Автор: bars80080 11.3.2009, 21:48 |
угу |
| Автор: pizzz 12.3.2009, 05:33 |
| Я бы его еще проверял strlen |
| Автор: pompei 12.3.2009, 06:14 | ||
| А я всегда по тупому поступаю: любые аргументы прогоняю через mysql_real_escape_string (даже целые) - 100% гарантия от sql-injection. А чтобы не париться со всякими-там конкатенациями и не писать часто длиннющую функцию mysql_real_escape_string - я написал класс, и всегда в базу хожу так:
set_param($substring, $value) - в sql-строке все подстроки (":".$substring) заменяет на mysql_real_escape_string($value) а mysql сам преобразует строку в число если колонка целочисленная |
| Автор: xoma 12.3.2009, 09:15 |
| а можно для работы с БД просто воспользоваться http://ru.php.net/pdo |
| Автор: gta4kv 12.3.2009, 09:33 | ||||||||||||||||||
pizzz, спасибо поржал.
isset при пустом id возвращает true, отличный совет вы дали. Было бы правильнее:
Это универсальный способ, при отсутствие id — false, при пустом — false.
Вообще то будет 0. И я предполагаю что в коде будет проверка на не существование записи, так что если юзер полезет корявыми руками то все равно ничего не выйдет. zluka, прежде чем выводить проверяйте нашлось ли что нибудь:
зачем?
Это только параноикам Так же прошу заметить что такая конструкция:
не пропустила бы id = 0, ибо 0 === false |
| Автор: pompei 16.3.2009, 14:33 | ||
абсолютно согласен |
| Автор: IZ@TOP 16.3.2009, 16:58 | ||
В mysqli тоже есть prepare. |