Как отфильтровать текст перед сохранением в Mysql ?

slavon-x86

Well-known member
18.12.2005
215
0
#1
<textarea name="comments" wrap="virtual" style="width:100%; height:140;></textarea>

Как отфильтровать текст так, чтобы его можно было безопасно сохранить в MySQL, а затем вывести на сайте !?
 

slavon-x86

Well-known member
18.12.2005
215
0
#4
Код:
	$string = ereg_replace("<","<",$string);
$string = ereg_replace(">",">",$string);
$string = ereg_replace('\\\"',""",$string);
$string = ereg_replace(":",":",$string);
$string = ereg_replace("\r","",$string);
$string = ereg_replace("\n","<br>",$string);
$string = ereg_replace("%","%",$string); //если этого не сделать, то вас могут круто отыметь -)
$string = ereg_replace("^ +","",$string);
$string = ereg_replace(" +$","",$string);
$string = ereg_replace(" +"," ",$string);
А вот этого достаточно ?
 
L

LIGHT

#5
Лучше написать ф-ию примерно такую, можно конечно красивейи придумать это как мысль

function eregs($x1)
{
$x1=ereg_replace("'","",$x1);
$x1=ereg_replace("`","",$x1);
$x1=ereg_replace("\*","",$x1);
$x1=ereg_replace(">","",$x1);
$x1=ereg_replace("<","",$x1);
$x1=ereg_replace(" "," ",$x1);
$x1=ereg_replace("%","",$x1);
$x1=ereg_replace("#","",$x1);
$x1=ereg_replace(";",",",$x1);
$x1=ereg_replace("\"","",$x1);
$x1=ereg_replace("~","-",$x1);
$x1=ereg_replace("\^","",$x1);
$x1=ereg_replace("\&","",$x1);
$x1=ereg_replace("\]",")",$x1);
$x1=ereg_replace("\[","(",$x1);
$x1=ereg_replace("\{","(",$x1);
$x1=ereg_replace("\}",")",$x1);
return $x1;
}
а дальше

$str=eregs($srt);

и везде где понадобится делать проверку юзать

$str=eregs($srt);
 
M

MajestiC

#6
Зачем изобретать велосипед.

mysql_real_escape_string для занесения.

Если хочешь убрать все тэги - strip_tags

При выводе используй htmlspecialchars
 
G

GOsha

#7
Для: MajestiC
Полностью согласен...
Они бы еще массив выводили, подбирая ключи
aa
ab
ac
ad
....
Народ, купите себе учебник.
 

slavon-x86

Well-known member
18.12.2005
215
0
#8
А вот я не согласен !

Код:
mysql_real_escape_string для занесения.
- делает прослэшивание и этим самым видоизменяет текст ! А это уже плохо !

Код:
Если хочешь убрать все тэги - strip_tags
- против этой функции я ничего не имею, но она мне не подходит, т.к. тоже оставляет не весь текст !

Код:
При выводе используй htmlspecialchars
- эта вобще неполноценная функция. Например вот это
$string = ereg_replace("%","%",$string); //если этого не сделать, то вас могут круто отыметь -)
оно не заменяет, а следовательно возможен хак !


А если текст преобразовать этой функцией: "htmlentities", а потом сохранить и вывести, то это будет безопасно ?
 
M

MajestiC

#9
>А вот я не согласен !
Поздравляю, только вот надо сначала быть уверенным и знать элементарные функции php, а точнее то, что они делают.

>>
Код:
mysql_real_escape_string для занесения.
>- делает прослэшивание и этим самым видоизменяет текст ! А это уже плохо !

Бред. У вас в базе данных окажется именно тот текст который вы хотите занести в бд. mysql_real_escape_string лишь экранирует кавычки для взаимопонимания с БД когда вы вставляете запись. Например если ваш текст "я мега"хакер\и вообще я знаю PHP ", то SQL инсерта без него будет выглядеть как INSERT INTO table (text) VALUES ("я мега "хакер \и вообще я знаю PHP "), что естественно вызовет синтаксическую ошибку, а после использования экранирования (например mysql_real_escape_string) SQL запрос будет выглядеть как INSERT INTO table (text) VALUES ("я мега \" хакер \\и вообще я знаю PHP"), при этом в БД окажется именно тот текст, который вы хотели вставить.

>>
Код:
Если хочешь убрать все тэги - strip_tags
>- против этой функции я ничего не имею, но она мне не подходит, т.к. тоже оставляет не весь текст !
Дело ваше.

>>
Код:
При выводе используй htmlspecialchars
>- эта вобще неполноценная функция. Например вот это
>$string = ereg_replace("%","%",$string); //если этого не сделать, то вас могут круто отыметь -)
>оно не заменяет, а следовательно возможен хак !
Где вы вычитали такой бред. Ваша регулярка помоему (я просто всегда preg использую) ничего не делает.
А теперь обьясните мне, как вы сделаете хак выведя текст через htmlspecialchars? JavaScript или что? Советую попробовать.

>А если текст преобразовать этой функцией: "htmlentities", а потом сохранить и вывести, то это будет безопасно ?
Вы русский текст htmlentities когда-нибудь кодировали?
 

slavon-x86

Well-known member
18.12.2005
215
0
#10
Код:
Бред. У вас в базе данных окажется именно тот текст который вы хотите занести в бд. mysql_real_escape_string лишь экранирует кавычки для взаимопонимания с БД когда вы вставляете запись. Например если ваш текст "я мега"хакер\и вообще я знаю PHP ", то SQL инсерта без него будет выглядеть как INSERT INTO table (text) VALUES ("я мега "хакер \и вообще я знаю PHP "), что естественно вызовет синтаксическую ошибку, а после использования экранирования (например mysql_real_escape_string) SQL запрос будет выглядеть как INSERT INTO table (text) VALUES ("я мега \" хакер \\и вообще я знаю PHP"), при этом в БД окажется именно тот текст, который вы хотели вставить.
"\n" будет "\\n" и т.д. Добавляет лишнюю черту к спец. тегам !

Код:
>- эта вобще неполноценная функция. Например вот это
>$string = ereg_replace("%","%",$string); //если этого не сделать, то вас могут круто отыметь -)
>оно не заменяет, а следовательно возможен хак !
Где вы вычитали такой бред. Ваша регулярка помоему (я просто всегда preg использую) ничего не делает. 
А теперь обьясните мне, как вы сделаете хак выведя текст через htmlspecialchars? JavaScript или что? Советую попробовать.
$string = ereg_replace("%","&#37",$string); - вот так !
printf("123%456", "<?php ... ?>"); Я не мастер в php, но думаю что процент нужно обязательно заменять кодом (это и написано кем-то в предыдущих сообщениях) !
 
G

GOsha

#11
В данном споре полностью поддерживаю маджестика.
Если сам возьмешься за алгоритмы безопасности без специальных знаний, то фиг ты сделаешь его безопасным. Это еще 3 курс БГУ ФПМИ "Основы компьютерной безопасности".
А если не сделаешь стриптагс, то я тебе в базу запишу яваскрипт, который при открытии данных будет отсылать юзера на мой сайт. Все просто, как 5 копеек.
 
A

Artexoid

#12
"\n" будет "\\n" и т.д. Добавляет лишнюю черту к спец. тегам !
А в базу запишется не \\n, а \n как нужно. :)
А вот так будут все довольны :)

Код:
<?
function value_escape($value)
{
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
if (!is_numeric($value)) 
{
$value = "'".mysql_real_escape_string($value)."'";
$value = ereg_replace("%","&#37",$value);
} 
return $value;
};
?>
Решил внести свою лепту с учётом всех высказываний B)...
 
M

MajestiC

#13
<!--QuoteBegin-slavon-x86+5:03:2007, 20:19 -->
<span class="vbquote">(slavon-x86 @ 5:03:2007, 20:19 )</span><!--QuoteEBegin-->"\n" будет "\\n" и т.д. Добавляет лишнюю черту к спец. тегам !
[snapback]58276" rel="nofollow" target="_blank[/snapback]​
[/quote]
Попытаюсь обьяснить.
Когда вы пишите:
$sString = "\ns\n";
Это не значит что в строке содержится 2 символа "\" и "n", слэша и n там вообще нет. Сейчас в строке $sString сожержится символ с ASCII-кодом 13, буква 's', и еще 1 символ с ASCII-кодом 13.

Если же вы напишите $sString = '\ns\n'; (В одинарных кавычках), то в строке $sString будут содержаться 5 символов: "\", "\n", "s", "\", "n".

Так вот к чему я это всё, теперь давайте посмотрим как эти строки поведут себя при фильтрации через mysql_real_escape_string.
1-ый пример chr(13).'s'.chr(13) преобразуется в строку '\ns\n'
2-ой пример '\ns\n' = '\\ns\\n'
Именно таким текстом они пойдут в SQL запрос.
А дальше MySQL сам будет воспроизводить эти строки.
INSERT INTO table VALUES ('\ns\n') = запись с символом 13, буквой 's', символом 13
INSERT INTO table VALUES ('\\ns\\n') = запись с строкой '\ns\n'
В итоге, то что мы хотели занести в БД, туда так и занеслось.

Надеюсь понятно объяснил.

<!--QuoteBegin-slavon-x86+5:03:2007, 20:19 -->
<span class="vbquote">(slavon-x86 @ 5:03:2007, 20:19 )</span><!--QuoteEBegin-->$string = ereg_replace("%","&#37",$string); - вот так !
printf("123%456", "<?php ... ?>"); Я не мастер в php, но думаю что процент нужно обязательно заменять кодом (это и написано кем-то в предыдущих сообщениях) !
[snapback]58276" rel="nofollow" target="_blank[/snapback]​
[/quote]
Причем тут вообще printf?

btw, давно на preg переходить надо.
 

slavon-x86

Well-known member
18.12.2005
215
0
#14
Блин, вы все говорите что я ламер, а сами ничего толком написать не можете !

Код:
mysql_real_escape_string($string)
- если я сохраню вот так, это будет безопасно ?

htmlspecialchars - не заменяет кавычку '
 
M

MajestiC

#15
mysql_real_escape_string безопасно вставит ваши данные в БД.
Но если данные содержат тэги и вы их потом будете выводить не фильтруя через htmlspecialchars, то это не безопасно.

Насчет кавычек:
Заменяет. Но нужно поставить флаг ENT_QUOTES.
htmlspecialchars($sString, ENT_QUOTES);
 

slavon-x86

Well-known member
18.12.2005
215
0
#16
Код:
htmlspecialchars($sString, ENT_QUOTES);
- и этого будет достаточно для безопасного вывода ?

p.s. - я ещё потом добавляю смайлики в этот текст вот так:
Код:
$sString = str_replace(':-)', '<img width="20" height="24" src="images/smiles/ab.gif">', $sString);
Это не повлияет на безопасность ?
 
M

MajestiC

#17
1. Достаточно, лучше вообще делай еще и strip_tags перед вставкой в бд, если не нужно отображать тэги.
2. Нет, не повлияет.
 

slavon-x86

Well-known member
18.12.2005
215
0
#18
Немного разобрался !
Код:
mysql_real_escape_string($string)
- вот только эта функция добавляет к косой черете \ ещё одну ! Это происходит только с косой чертой или есть ещё какие-то видоизменения текста ? И возможно ли это исправить ?
 
M

MajestiC

#19
Ну так все нормально =)))

Она же предназначеная для формирования запроса.

$sString = '\'; - Вот твоя черта.

mysql_query('INSERT INTO table VALUES ("'.mysql_real_escape_string($sString).'")');

сделает запрос

INSERT INTO table VALUES ("\\")

То есть в базу вставится 1 черта.
 

slavon-x86

Well-known member
18.12.2005
215
0
#20
:( Да 2 вставляется !
INSERT INTO table VALUES ("\\")

То есть в базу вставится 1 черта.
Ну 2 вставляется ! Вот: "\\" - две черты !

__________________
Вот так я вставляю

Код:
$string = $_GET['comments'];

$string = mysql_real_escape_string($string);
$string = strip_tags($string);

mysql_query("INSERT INTO comments VALUES ('" . 

$name . "', '" .									 
$string .									 

"')") or ($e = "Ошибка при добавлении записи в таблицу.");