Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   фильтрация данных на пхп (https://forum.antichat.xyz/showthread.php?t=57102)

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

Цитата:

Сообщение от Piflit
Скрипт работает с 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);

так?

Цитата:

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

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

Macro 01.01.2008 21:45

Можно проще.

PHP код:

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


Isis 01.01.2008 21:49

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

Piflit 01.01.2008 21:51

Цитата:

Сообщение от Isis
Охохо...если вы думаете что 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

Цитата:

Сообщение от Isis
Охохо...если вы думаете что 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

Цитата:

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

Цитата:

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

с кавычками так?
PHP код:

$var str_replace('"'""$var);
$var str_replace("'"""$var); 

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

Macro 01.01.2008 22:12

Цитата:

Сообщение от astrologer
Указать кодировку в мета-тэге, например:
Код:

<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

Цитата:

Сообщение от Piflit
ничего такого нет.


а вдруг я сделаю, а исис меня похекает? :(

Если ты параноик, юзай перед добавлением base64_encode, а перед выводом - htmlentities( strip_tags(base64_decode()),ENT_QUOTES)

.:EnoT:. 01.01.2008 22:43

лично я против xss использую не только htmlspecialchars() но и stripslashes()
а против sql-inj
PHP код:

$_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

Цитата:

Сообщение от .:EnoT:.
лично я против xss использую не только htmlspecialchars() но и stripslashes()
а против sql-inj
PHP код:

$_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

Цитата:

Сообщение от .:EnoT:.
лично я против xss использую не только htmlspecialchars() но и stripslashes()
а против sql-inj
PHP код:

$_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']); 

фильтрация символов ' & + / * вполне имхо достаточна

нуну, а если код типа
PHP код:

$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

Цитата:

Сообщение от +toxa+
нуну, а если код типа
PHP код:

$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

Цитата:

Сообщение от +toxa+
нуну, а если код типа
PHP код:

$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

чтониб вроде..
PHP код:

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
PHP код:

htmlspecialchars('<script>alert("xss")</script>'); 

, mysql_escape_string спасёт от скули
PHP код:

mysql_query("SELECT test FROM test WHERE test2 = '".mysql_escape_string("1'+order+by+100")."'"); 

, чтобы проинклудить файл нужно проверять его существование на сервере
PHP код:

if(file_exists('./'.$_GET['file'])) {
  include(
$_GET['file']);
 } 

(просто примеры), а лучше фильтровать символы.
PHP код:

preg_replace('|[^a-z0-9]|i'NULL$_GET['test']); 


Евгений Минаев 02.01.2008 01:34

Не надо заморачиваться , все предельно просто . Все передаваемые значения должны быть в ковычках , это сразу спасает от 99 процентов проблем да и mysql проглотит этот запрос быстрее , прежде чем применить
PHP код:

addslashes() 

надо проверить включены ли magic_quotes_gpc
PHP код:

get_magic_quote_gpc 

четко выставить кодировку , желательно отфильтровать данные на спецсимволы
PHP код:

$text trim $text );$text trim $text "\x00..\x1F" ); 

htmlspecialchars надо использовать с ENT_QUOTES иначе одинарная ковычка не будет фильтроваться
PHP код:

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();
все?

PHP код:

INSERT INTO table (loginpassVALUES ('".$_POST["login"]."','".$_POST["pass"]."'); 

PHP код:

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

Цитата:

Сообщение от .Slip
Третий пункт выкидываай из своего понимания.

почему? а <скрипт> итп при выводе?
Цитата:

Сообщение от .Slip
Проверка на существование (isset()).

на существование чего? не понял.
Цитата:

Сообщение от .Slip
во втором случае окружение кавычками и экранирование.

что еще нужно экранировать после mysql_escape_string();?

ettee 02.01.2008 04:43

PHP код:

< > " ' % ; ) ( & + 

Так же смотри не происходить ли автоматическое преобразование символов.
Не забываем про фокус замены символа пробела на
PHP код:

/**/ 

Надежней пропускать только то что разрешено, чем блокировать "черные списки".
По возможности использовать HttpOnly-cookies. Параноикам поможет шифрование cookie.
При нападение с помощью TRACE метода претензии к хостеру.
PHP код:

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']);
наверное правильнее регуляркой проверять на допустимые символы, чем вырезать все недопустимые, так ведь?


Время: 20:41