Byrger, не слушай Pashkely. PHP: <? $array=array('union','select','and','or'); $string="http://site.ru/script.php?id=1+union+select+1"; foreach($array as $value) $string=preg_replace("#".$value."#i","",$string); echo $string; ?>
Pashkela, если ты не в курсе, Символ "i" после закрывающего ограничителя шаблона означает регистронезависимый поиск. Бургер, вот с функцией: PHP: <? $array=array('union','select','and','orx','\+'); $string="http://site.ru/script.php?id=1+union+select+1"; foreach($array as $value) { $pattern="#".$value."#i"; if(preg_match($pattern,$string)) { $string=preg_replace($pattern,false,$string); $function="echo '<h1>Попытка взлома!</h1>';"; //функкция } } echo $string; @eval($function); ?>
Если не нужны сложные замены то предпочтительней использовать str_ireplace(str_replace в 4 ветки с извратом strtolower или strtoupper ), во вторых представь ситуацию preg_match($pattern,$string) вернет 0 замен и у нас будет возможность перезаписать $function (переменые переменых, Global Owerwrite и etc ) то мы получем шелл
Вот вы балбесы))))))))))))) ухахахахахаха, вот такое представление о защите и делает возможным имение серверов с кучей сайтов. HTML: $string="http://site.ru/script.php?id=1/**/ununionion/**/seselectlect/**/1"; ЧТОБЫ ОТФИЛЬТРОВАТЬ ВСЕ - НУЖНО НАПИСАТЬ СУПЕРЗДОРОВЫЙ КЛАСС ДЛЯ ПАРСИНГА SQL ВЫРАЖЕНИЙ, ЧТО ПРОСТО БЕССМЫСЛЕННО!!!
Двум умникам выше (кроме SQLHACK есс-но) - если говорят дебильные фильтры, значит так оно и есть PHP: <?php $array=array('union','select','and','or'); $string="http://site.ru/script.php?id=1+uniunionon+seselectlect+1"; foreach($array as $value) $string=preg_replace("#".$value."#i","",$string); echo $string; ?> +, о чем я сразу и написал, не проще просто нормальный код писать и проверять и обрабатывать только переменные, а не " все возможные существующие варианты"
Ну куда мне до тебя супер умного, я же забыл что в MySQL есть оператор unтра-та-таion и seтра-та-таlect: PHP: $array_search=array('union','select','group','orde r','limit'); $input="http://site.ru/script.php?id=1+uniunionon+seselectlect+1"; echo str_ireplace($array_search,'тра-та-та',$input,$count); http://site.ru/script.php?id=1+uniтра-та-таon+seтра-та-таlect+1
Byrger, зачем так делать? --Фильтрация для числовых значений: PHP: $id = (int)$_GET['id']; --Фильтрация для буквенных значений: PHP: $text = mysql_escape_string(get_magic_quotes()?stripslashes($_GET['text']):($_GET['text'])); + не забывай обрамлять эти параметры в кавычки в запросе!!! и никакой хакер не пройдет.
Вот вам функция , которой достаточно в 99% случаев. PHP: function db_prepare($arg){ global $db_c; if(is_numeric($arg)){ return "'".$arg."'"; }else if(is_string($arg)){ return "'".mysql_real_escape_string($arg, $db_c)."'"; }else{ return "''"; } } Где $db_c это переменная-ресурс коннекта к БД ну или вообще убрать его PHP: function db_prepare($arg){ if(is_numeric($arg)){ return "'".$arg."'"; }else if(is_string($arg)){ return "'".mysql_real_escape_string($arg."'"; }else{ return "''"; } } что такое 1% это внесение в БД файлов и всякой нестандартной всячины. Перез использованием данной фунции должно быть установлено соединение с БД. Запрос выглядит так $query = "SELECT a,b,c,d FROM XXXX WHERE id=".db_prepare($id)." order by 1"; то есть параметр сам будет обрамлятся кавычками, в запросе их писать не надо. Юзайте и будет вам счастье.
ебт, ты всунь эту строку в скрипт и скрипт вырежет union и select в середине слов, и в БД пройдут чистые union select
Оо нифига на 2 страницы растянули : ) Спасибо всем. А как достать строку из браузера которую пользователь вводит?
имел ввиду функцию mailbrush'a 2 PaCo: А твой пример с тратата тупо будет заплевывать как как Юзера ошибками, так и БД левыми не рабочими запросами Действительно куда тебе до меня супер умного ))))
2 PaCo: $input="http://site.ru/script.php?id=1+%75%6E%69%6F%6E+%73%65%6C%65%63%74+1"; реальный пример: Code: http://www.cz-usa.com/product_detail.php?id=-7+%75%6E%69%6F%6E+%73%65%6C%65%63%74+1,2,3,4,version(),6/* усовершенствуй код, и я его опять обойду, но уже за деньги
PHP: echo htmlspecialchars($_SERVER['SCRIPT_URI']); не забывай , если в базу заносишь фильтрацию на кавычки На JavaScript: PHP: alert(document.location.href); SQLHACK, твой код тоже уязвим для мультибайтовых кодировок из-за ошибки в mysql_real_escape_string жмяк
Не хочу тебя растраивать но данные пришедшие из вне уже будут будут преобразованны в нормальный вид(попробуй зделать echo $_GET['id']) ), и если не делать повторного преобразования в коде то это НИЧЕГО НЕ ДАСТ, Byrger спросил как зделать так и так и я ответил, конечно же самый разумный вариант это проверка данный на соответсвия их типу прежде чем вставлять их в гвери.
Почему бы не использовать prepared statement'ы, как это делают во всех других языках? Они и выполняются быстрее и необходимость в какой-либо изощренной фильтрации отпадает.
Блин все уже давно написано, я вон функцию скинул простую и 100% надежную , Chaak собсввенно тоже самое написал но по другом, в конце концов посмотрите вы например как в WordPress сделано. \ Че вы в тысячный раз велосипед изобретаете.
SQLHACK В том то и дело, что велосипед - это ваши функции. А prepared statement'ы это проверненное и повсеместно используемое решение. Я мало знаком с php, поэтому врядли вам могу что-нибудь советовать. Но тем не менее в других языках не пишут какие то свои функции, а используют prepared statement'ы. Я не агитирую вас, просто задался вопросом зачем что-то свое писать, если есть готовое на уровне языка причем?