Просмотр полной версии : фильтрация данных на пхп
Скрипт работает с mysql. Ему передаются данные типа ников, затем другой скрипт их выводит, т.е. обрезать все спецсимволы нельзя. + нужна поддержка кириллицы. У меня есть два варианта.
1. htmlspecialchars + strip_tags + регулярка (как задать кириллицу? [а-яА-я]?). Тогда какие спецсимволы нужно фильтровать? Я думаю, в самих скриптах не может быть inj, т.к. там используется только insert и select(парамерты жестко заданы), но интересен сам способ.
2. Перед записью конвертить все через ord, а перед выводом chr.
Для защиты от xss достаточно htmlspecialchars() или нужно что-то еще?
Скрипт работает с mysql. Ему передаются данные типа ников, затем другой скрипт их выводит, т.е. обрезать все спецсимволы нельзя. + нужна поддержка кириллицы. У меня есть два варианта.
1. htmlspecialchars + strip_tags + регулярка (как задать кириллицу? [а-яА-я]?). Тогда какие спецсимволы нужно фильтровать? Я думаю, в самих скриптах не может быть inj, т.к. там используется только insert и select(парамерты жестко заданы), но интересен сам способ.
2. Перед записью конвертить все через ord, а перед выводом chr.
Для защиты от xss достаточно htmlspecialchars() или нужно что-то еще?
Достаточно сделать htmlspecialchars() и фильтр от кавычек и все. Никаких xss или sql inj не получится
baltazar
01.01.2008, 21:04
Ога Макро прав htmlspecialchars() хватит
astrologer
01.01.2008, 21:30
Зависит всё же от того, где они выводятся.
Кодировку нужно указать в явном виде против Utf-7
$var = htmlspecialchars($var);
$var = ereg_replace("((\'\")+)", "", $var);
так?
Зависит всё же от того, где они выводятся.
Кодировку нужно указать в явном виде против Utf-7
Выводятся в виде хтмл кода.
Где указать кодировку?
Можно проще.
$var = htmlspecialchars($var);
$var = str_replace("'","",$var);
Охохо...если вы думаете что htmlspecialchars спасает от всего, то вы горекодеры...
Охохо...если вы думаете что htmlspecialchars спасает от всего, то вы горекодеры...
заинтриговал...
baltazar
01.01.2008, 21:51
ну на сколько я знаю htmlspecialchars спасает от скулей и икссс
baltazar
01.01.2008, 22:01
вобщем ты получил ответ на свой вопрос,если что пусть Исис расскажет что оон хотел сказать...)
Охохо...если вы думаете что htmlspecialchars спасает от всего, то вы горекодеры...
Угу, а ты попробуй обойди htmlspecialchars, хватит тут выпендриваться.
astrologer
01.01.2008, 22:06
Указать кодировку в мета-тэге, например: <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">Выводятся в виде хтмл кода.Я имел ввиду, что они могли быть:
- в тэге <title>,
- в тэгах <div>, <span>, и т.д,
- в тэгах <style>, <script> (omg),
- в названии атрибута тэга,
- в значении атрибута тэга.
От этого зависят правила фильтрации.
Я имел ввиду, что они могли быть:
ничего такого нет.
вобщем ты получил ответ на свой вопрос,если что пусть Исис расскажет что оон хотел сказать...)
а вдруг я сделаю, а исис меня похекает? :(
с кавычками так?
$var = str_replace('"', "", $var);
$var = str_replace("'", "", $var);
зы у меня кодировка windows-1251
Указать кодировку в мета-тэге, например: <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">Я имел ввиду, что они могли быть:
- в тэге <title>,
- в тэгах <div>, <span>, и т.д,
- в тэгах <style>, <script> (omg),
- в названии атрибута тэга,
- в значении атрибута тэга.
От этого зависят правила фильтрации.
В принципе, если я правильно помню, атака с помощью utf-7 может быть только там, где не установлена кодировка в хедере, в мета-тегах и utf-7 идет с самого начала, иначе кодировкой данной страницы считается кодировка первого встреченного текста. Я прав?
baltazar
01.01.2008, 22:15
непохекает,мы его подкупим))
ничего такого нет.
а вдруг я сделаю, а исис меня похекает? :(
Если ты параноик, юзай перед добавлением base64_encode, а перед выводом - htmlentities( strip_tags(base64_decode()),ENT_QUOTES)
.:EnoT:.
01.01.2008, 22:43
лично я против xss использую не только htmlspecialchars() но и stripslashes()
а против sql-inj
$_POST['a'] = str_replace("'","", $_POST['a']);
$_POST['a'] = str_replace("&","", $_POST['a']);
$_POST['a'] = str_replace("+","",$_POST['a']);
$_POST['a'] = str_replace("/","",$_POST['a']);
$_POST['a'] = str_replace("*","",$_POST['a']);
фильтрация символов ' & + / * вполне имхо достаточна
лично я против xss использую не только htmlspecialchars() но и stripslashes()
а против sql-inj
$_POST['a'] = str_replace("'","", $_POST['a']);
$_POST['a'] = str_replace("&","", $_POST['a']);
$_POST['a'] = str_replace("+","",$_POST['a']);
$_POST['a'] = str_replace("/","",$_POST['a']);
$_POST['a'] = str_replace("*","",$_POST['a']);
фильтрация символов ' & + / * вполне имхо достаточна
$var=stripslashes(htmlentities($var, ENT_QUOTES));
И никаких sql inj и xss быть не может
лично я против xss использую не только htmlspecialchars() но и stripslashes()
а против sql-inj
$_POST['a'] = str_replace("'","", $_POST['a']);
$_POST['a'] = str_replace("&","", $_POST['a']);
$_POST['a'] = str_replace("+","",$_POST['a']);
$_POST['a'] = str_replace("/","",$_POST['a']);
$_POST['a'] = str_replace("*","",$_POST['a']);
фильтрация символов ' & + / * вполне имхо достаточна
нуну, а если код типа
$query="select hek_title,hek_header,hek_footer from hek_temp where hek_id=".$_POST['id']; ?)
при id=-1 union select hek_name,hek_password,hek_mail from hek_users всё будет норм выполняться
нуну, а если код типа
$query="select hek_title,hek_header,hek_footer from hek_temp where hek_id=".$_POST['id']; ?)
при id=-1 union select hek_name,hek_password,hek_mail from hek_users всё будет норм выполняться
Ну дык речь идет про текст ведь, т.е. про данные в кавычках ;) Без кавычек, разумеется. Если данные должны быть int, тогда intval() в помощь.
.:EnoT:.
01.01.2008, 23:15
нуну, а если код типа
$query="select hek_title,hek_header,hek_footer from hek_temp where hek_id=".$_POST['id']; ?)
дык твой запрос не будет выполнен, т.к. ошибка синтаксиса :p
а если выборку по id делать то можно intval() применить :)
может лучше вместо stripslashes(); $var = str_replace("\\", "", $var); ?
тоха, мне нужны не числовые параметры. а для числовых, конечно, intval() + проверка на знак =)
blackybr
02.01.2008, 00:39
чтониб вроде..
function xek($string)
{
if (get_magic_quotes_gpc()) {
$string = stripslashes($string);
}
if (!is_numeric($string)) {
$string = "'" . mysql_real_escape_string($string) . "'";
}
return htmlspecialchars($string);
}
а потом это уже в запрос кидать..
ну еще в довесок можно проверять на a-zA-Z0-9, хотя в идеале хватит только его. если точно знаешь что другого не будет в строке
blackybr зачем добавлять одинарные кавычки, если параметр is_numeric?
blackybr
02.01.2008, 01:20
если не число, то mysql_real_escape_strin и добавляем кавычки чтобы в запрос передать в кавычках уже строку) хотя прав, не обязательно, но почему бы и нет
htmlspecialchars спасёт от XSS htmlspecialchars('<script>alert("xss")</script>');, mysql_escape_string спасёт от скули mysql_query("SELECT test FROM test WHERE test2 = '".mysql_escape_string("1'+order+by+100")."'");, чтобы проинклудить файл нужно проверять его существование на сервере if(file_exists('./'.$_GET['file'])) {
include($_GET['file']);
}
(просто примеры), а лучше фильтровать символы.
preg_replace('|[^a-z0-9]|i', NULL, $_GET['test']);
Евгений Минаев
02.01.2008, 01:34
Не надо заморачиваться , все предельно просто . Все передаваемые значения должны быть в ковычках , это сразу спасает от 99 процентов проблем да и mysql проглотит этот запрос быстрее , прежде чем применить
addslashes()
надо проверить включены ли magic_quotes_gpc
get_magic_quote_gpc
четко выставить кодировку , желательно отфильтровать данные на спецсимволы
$text = trim ( $text );$text = trim ( $text , "\x00..\x1F" );
htmlspecialchars надо использовать с ENT_QUOTES иначе одинарная ковычка не будет фильтроваться
htmlspecialchars( $text , ENT_QUOTES);
В случае запроса-поиска надо экранировать %,_ . Главное правило - не доверять всем входящим от юзера данным , точнее всему тому на что может повлиять юзер , но не показывать этому юзеру свое недоверие
Ну и ну, ребята. Столько сообщений, и нет ни одного грамотного ответа. Надо бы подождать nerezus'а, он знает ответ. Если ждать его лень (новый год как никак), бегом искать его статью о защите от "SQL инъекций". Там есть ответ на вопрос, который мучает здесь вас всех, а именно:
"Как защитить любое веб приложение от любой атаки, отличной от атаки грубой силой?"
Ни много ни мало. Формулировку вам придется натянуть на его "статью" самостоятельно.
Кстати, любой (даже низкой степени заинтересованности) студент любого ВУЗа любого IT факультета знает ответ на этот вопрос! Задумайтесь об этом, задумайтесь о том, чему вы научились, столько времени потратив на прочтение этого форума!?
Отдельная просьба Зеленому Мишке и всем прочим модераторам, хотя бы в честь Нового Года не трогать это сообщение, тем более, что в действительности, это первый ответ в этой теме, все остальное можно удалить!
intval(), mysql_escape_string()
=\
как я понял, прочитав http://forum.antichat.ru/thread30641.html
при вводе (+заключаем в кавычки).
1. если число, intval();
2. если строка, mysql_escape_string();
+заключаем в кавычки.
3. при выводе htmlspecialchars();
все?
INSERT INTO table (login, pass) VALUES ('".$_POST["login"]."','".$_POST["pass"]."');
SELECT pass FROM table WHERE login '".$_POST["login"]."';
если кавычки (') стоят в самом запросе, то можно вообще ничего не экранировать?
1. если число, intval();
2. если строка, mysql_escape_string();
Третий пункт выкидываай из своего понимания. Проверка на существование (isset()) и выборка целого числа в первом случае (если кто то пихает херню с -, то можно добавить bcmod()), во втором случае окружение кавычками и экранирование.
Третий пункт выкидываай из своего понимания.
почему? а <скрипт> итп при выводе?
Проверка на существование (isset()).
на существование чего? не понял.
во втором случае окружение кавычками и экранирование.
что еще нужно экранировать после mysql_escape_string();?
< > " ' % ; ) ( & +
Так же смотри не происходить ли автоматическое преобразование символов.
Не забываем про фокус замены символа пробела на
/**/
Надежней пропускать только то что разрешено, чем блокировать "черные списки".
По возможности использовать HttpOnly-cookies. Параноикам поможет шифрование cookie.
При нападение с помощью TRACE метода претензии к хостеру.
TraceEnable off
Да что вы тут развели дискуссию? Все повторяют сообщения, которые тут уже написаны. Для проверки любых данных на sql инъекцию, xss или инклуд,
способов не так уж и много!
Для проверки sql строк достаточно mysql_real_escape_string()
Все числовые параметры sql стоит писать через intval()
Для защиты от xss вполне хватит функции htmlspecialchars() либо htmlentities()
Проверка на кириллицу вот - $str=preg_replace('/[^а-я]/i','',$str);
Если нужна проверка на инклуд.
Во первых, инклудить лучше файлы с префиксом, например
include('./inc/inc_'.$_GET['page']);
Во вторых, лучше приписывать расширение к файлу и желательно, чтобы это расширение не было '.php' .
include('./inc/inc_'.$_GET['page'].'.inc');
В третьих, существование файла надо проверять и фильтровать точки :).
$_GET['page']=str_replace('.','',$_GET['page']);
file_exists('./inc/inc_'.$_GET['page'].'.inc')?include('./inc/inc_'.$_GET['page'].'.inc'):echo('неверный файл');
На все вопросы автора ответили уже :)
GreenBear
02.01.2008, 13:51
$_GET['page']=str_replace('.','',$_GET['page']);
наверное правильнее регуляркой проверять на допустимые символы, чем вырезать все недопустимые, так ведь?
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot