PDA

Просмотр полной версии : фильтрация данных на пхп


Piflit
01.01.2008, 20:55
Скрипт работает с mysql. Ему передаются данные типа ников, затем другой скрипт их выводит, т.е. обрезать все спецсимволы нельзя. + нужна поддержка кириллицы. У меня есть два варианта.
1. htmlspecialchars + strip_tags + регулярка (как задать кириллицу? [а-яА-я]?). Тогда какие спецсимволы нужно фильтровать? Я думаю, в самих скриптах не может быть inj, т.к. там используется только insert и select(парамерты жестко заданы), но интересен сам способ.
2. Перед записью конвертить все через ord, а перед выводом chr.

Для защиты от xss достаточно htmlspecialchars() или нужно что-то еще?

Macro
01.01.2008, 20:58
Скрипт работает с 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

Piflit
01.01.2008, 21:42
$var = htmlspecialchars($var);
$var = ereg_replace("((\'\")+)", "", $var);

так?

Зависит всё же от того, где они выводятся.
Кодировку нужно указать в явном виде против Utf-7

Выводятся в виде хтмл кода.
Где указать кодировку?

Macro
01.01.2008, 21:45
Можно проще.


$var = htmlspecialchars($var);
$var = str_replace("'","",$var);

Isis
01.01.2008, 21:49
Охохо...если вы думаете что htmlspecialchars спасает от всего, то вы горекодеры...

Piflit
01.01.2008, 21:51
Охохо...если вы думаете что htmlspecialchars спасает от всего, то вы горекодеры...
заинтриговал...

baltazar
01.01.2008, 21:51
ну на сколько я знаю htmlspecialchars спасает от скулей и икссс

Piflit
01.01.2008, 21:54
а я ничего не знаю =\

baltazar
01.01.2008, 22:01
вобщем ты получил ответ на свой вопрос,если что пусть Исис расскажет что оон хотел сказать...)

Macro
01.01.2008, 22:03
Охохо...если вы думаете что 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),
- в названии атрибута тэга,
- в значении атрибута тэга.
От этого зависят правила фильтрации.

Piflit
01.01.2008, 22:11
Я имел ввиду, что они могли быть:
ничего такого нет.

вобщем ты получил ответ на свой вопрос,если что пусть Исис расскажет что оон хотел сказать...)
а вдруг я сделаю, а исис меня похекает? :(

с кавычками так?
$var = str_replace('"', "", $var);
$var = str_replace("'", "", $var);

зы у меня кодировка windows-1251

Macro
01.01.2008, 22:12
Указать кодировку в мета-тэге, например: <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
непохекает,мы его подкупим))

Macro
01.01.2008, 22:16
ничего такого нет.


а вдруг я сделаю, а исис меня похекает? :(
Если ты параноик, юзай перед добавлением 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']);
фильтрация символов ' & + / * вполне имхо достаточна

Macro
01.01.2008, 22:47
лично я против 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 быть не может

+toxa+
01.01.2008, 23:07
лично я против 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 всё будет норм выполняться

Macro
01.01.2008, 23:09
нуну, а если код типа
$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() применить :)

Piflit
01.01.2008, 23:46
может лучше вместо 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, хотя в идеале хватит только его. если точно знаешь что другого не будет в строке

Piflit
02.01.2008, 00:54
blackybr зачем добавлять одинарные кавычки, если параметр is_numeric?

blackybr
02.01.2008, 01:20
если не число, то mysql_real_escape_strin и добавляем кавычки чтобы в запрос передать в кавычках уже строку) хотя прав, не обязательно, но почему бы и нет

NOmeR1
02.01.2008, 01:34
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);

В случае запроса-поиска надо экранировать %,_ . Главное правило - не доверять всем входящим от юзера данным , точнее всему тому на что может повлиять юзер , но не показывать этому юзеру свое недоверие

DWORD
02.01.2008, 02:26
Ну и ну, ребята. Столько сообщений, и нет ни одного грамотного ответа. Надо бы подождать nerezus'а, он знает ответ. Если ждать его лень (новый год как никак), бегом искать его статью о защите от "SQL инъекций". Там есть ответ на вопрос, который мучает здесь вас всех, а именно:
"Как защитить любое веб приложение от любой атаки, отличной от атаки грубой силой?"
Ни много ни мало. Формулировку вам придется натянуть на его "статью" самостоятельно.
Кстати, любой (даже низкой степени заинтересованности) студент любого ВУЗа любого IT факультета знает ответ на этот вопрос! Задумайтесь об этом, задумайтесь о том, чему вы научились, столько времени потратив на прочтение этого форума!?

Отдельная просьба Зеленому Мишке и всем прочим модераторам, хотя бы в честь Нового Года не трогать это сообщение, тем более, что в действительности, это первый ответ в этой теме, все остальное можно удалить!

Spyder
02.01.2008, 02:42
О, ты вернулся :d

.Slip
02.01.2008, 03:15
intval(), mysql_escape_string()
=\

Piflit
02.01.2008, 04:00
как я понял, прочитав 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"]."';
если кавычки (') стоят в самом запросе, то можно вообще ничего не экранировать?

.Slip
02.01.2008, 04:08
1. если число, intval();
2. если строка, mysql_escape_string();
Третий пункт выкидываай из своего понимания. Проверка на существование (isset()) и выборка целого числа в первом случае (если кто то пихает херню с -, то можно добавить bcmod()), во втором случае окружение кавычками и экранирование.

Piflit
02.01.2008, 04:15
Третий пункт выкидываай из своего понимания.
почему? а <скрипт> итп при выводе?
Проверка на существование (isset()).
на существование чего? не понял.
во втором случае окружение кавычками и экранирование.
что еще нужно экранировать после mysql_escape_string();?

ettee
02.01.2008, 04:43
< > " ' % ; ) ( & +
Так же смотри не происходить ли автоматическое преобразование символов.
Не забываем про фокус замены символа пробела на
/**/
Надежней пропускать только то что разрешено, чем блокировать "черные списки".
По возможности использовать HttpOnly-cookies. Параноикам поможет шифрование cookie.
При нападение с помощью TRACE метода претензии к хостеру.
TraceEnable off

Macro
02.01.2008, 10:17
Да что вы тут развели дискуссию? Все повторяют сообщения, которые тут уже написаны. Для проверки любых данных на 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']);
наверное правильнее регуляркой проверять на допустимые символы, чем вырезать все недопустимые, так ведь?