Есть строчная переменная, которая берётся из $_POST или $_GET и вставляется в SQL-запрос. Как проверить её на наличие слов в любом регистре: INSERT, DELETE, UPDATE, SELECT? И ещё попутный нубский вопрос, SQL-инъекции возможны только через GET-запрос, или через POST тоже?
http://www.php.ru/manual/function.strpos.html а вообще вы фигнёй страдаете, это делается через mysql_real_escape_string гет, пост, куки - всё что вы потом используете в запросе
По этому на mysqli дружно переходим... И другое. Ну или тогда в массив и метод в нижний регистр и реплэйсом удалить...
Мда, я кстати посидел вчера, покурил и понял, что не стоило так делать.) Потому что там обрабатываются пользовательские поля, и там вполне могут быть слова select, delete, update, insert. Не говоря уже о html-теге <select>. В общем, решил вручную проверять только is_numberic, а все строчные значения прогоняю через mysql_real_escape_string. Этого точно достаточно, чтобы защититься от SQL-инъекций?
Достаточно будет экранирования, все остальное делается вообще для других целей, отсеивание не нужной информации...
Да. От первой волны. Однако, если кривые данные попадут в базу, то можно будет какнить исхитриться, и их присобачить куданить как часть запроса. Соотв, когда ты берёшь значения своего поля из бд, и вставляешь в запрос, то это тоже надо экранировать, несмотря на то, что это "из твоей же базы". Ну ты понял.
is_numberic тоже идёт нафик... mysql_real_escape_string для своих целей подходит, а is_numberic это вообще из другой оперы !!!
Что значит не существует? Ты, чего? (int), (integer) приведение к целочисленному типу данных. intval(); Тебе стоит точно суда заглянуть: php.net/manual/ru/language.types.type-juggling.php
Оо Это, что - то забакланило =)))). Хм... Адресовано Vladson. Код (PHP): $int1=10; // это целое число $str1=''.$int1.''; // это явная строка $str2=(string)$int1; // это явная строка $str3="$int1"; // это строка (не рекомендуется для проверки явной строки) $int2=(int)$str1; // это целое число var_dump($int1, // int(10) $str1, // string(2) "10" $str2, // string(2) "10" $str3, // string(2) "10" $int2); // int(10)
Это значит что он существует, но к SQL а точнее к инъекциям никакого отношения он не имеет. При составлении запросов мы используем строки и их отправляем в запрос. Приведение типов это вмешательство в данные, а их не надо трогать вообще. Просто грамотно использовать. По порядку - Принимаем $_GET в котором номер например страницы. (он кстати string) - ПРОВЕРЯЕМ что в нём именно положительное число. (что это строка, а в строке только цифры) - Отправляем в SQL-запрос без изменений. Всякие джедайские техники типа $sql="SELECT * WHERE `id` = " . (int)$_GET['id'] это бред который для новичков пишут, это чаще всего работает (если число до двух миллиардов) но это нарушение всех известных принципов программирования, это самый настоящий "костыль"
если у меня поле инт, я беру и кастую (int) и я обезопашен на 100% и мне срать какие там данные были присланы. =) счастье!
Данные идут не в поля, а в SQL запрос, в том виде в котором они должны идти. Хоть в HEX их пиши, в итоге всё равно будет SQL запрос.