| Приветствую всех, скачал ради интереса у вас в разделе веб-приложений самописный форум одного из участников (http://softtime.ru/info/forum.php).
В некоторых местах данные никак не фильтруются, а в файле reply_in.php я наткнулся на интересный фрагмент:
<?
$name = substr($HTTP_POST_VARS["name"],0,32);
$name = htmlspecialchars(stripslashes($name)); // обрабатываем имя
$email = substr($HTTP_POST_VARS["email"],0,32);
$email = htmlspecialchars(stripslashes($email)); // обрабатываем e-mail
$text = substr($HTTP_POST_VARS["text"],0,10000);
$text = htmlspecialchars(stripslashes($text)); // обрабатываем сообщение
//замена тегов
$text = str_replace("[u]","<u>",$text);
$text = str_replace("[U]","<u>",$text);
$text = str_replace("","<i>",$text);
$text = str_replace("[I]","<i>",$text);
$text = str_replace("","<B>",$text);
$text = str_replace("[B]","<B>",$text);
$text = str_replace("","<SUB>",$text);
$text = str_replace("[SUB]","<SUB>",$text);
$text = str_replace("","<SUP>",$text);
$text = str_replace("[SUP]","<SUP>",$text);
$text = str_replace("[/u]","</u>",$text);
$text = str_replace("[/U]","</u>",$text);
$text = str_replace("","</i>",$text);
$text = str_replace("[/I]","</i>",$text);
$text = str_replace("","</B>",$text);
$text = str_replace("[/B]","</B>",$text);
$text = str_replace("","</SUB>",$text);
$text = str_replace("[/sub]","</SUB>",$text);
$text = str_replace("","</SUP>",$text);
$text = str_replace("[/sup]","</SUP>",$text);
$text = eregi_replace("(.*)\\[url\\](.*)\\[/url\\](.*)","\\1<a target=_blank href=\\2>\\2</a>\\3",$text);
$text = str_replace("\n"," ",$text);
$text = str_replace("\r"," ",$text);
// Заменяем все одинарные кавычки обратными
// защита от инъекционных запросов
$name = str_replace("'","`",$name);
$email = str_replace("'","`",$email);
$text = str_replace("'","`",$text);
?>
|
И возникло сразу несколько вопросов:
1) Зачем сразу писать хтмл код в базу? Как потом его выводить через htmlspecialchars(); ? Это же проблематично. Лучше оставлять все в bb-тегах, а на выходе уже пропускать через функцию и получать html-теги + фильтровать htmlspecialchars'ом - тогда точно ничего не получится лишнего всунуть в БД.
2)
$name = substr($HTTP_POST_VARS["name"],0,32);
|
Я полагаю, $HTTP_POST_VARS - это дань прошлому, ведь форум написан в 2008 году. Сейчас вместо этого следует просто применять $_POST.
3)
$text = str_replace("\n"," ",$text);
$text = str_replace("\r"," ",$text);
|
Зачем делаются замены символов переноса строки?
4)
$name = htmlspecialchars(stripslashes($name));
|
Это нужно бы поменять на
$name = htmlspecialchars(stripslashes($name),ENT_QUOTES);
|
чтобы фильтровать оба типа кавычек: ",'
Если это сделать, то тогда можно убрать эти строки из кода?
$name = str_replace("'","`",$name);
$email = str_replace("'","`",$email);
$text = str_replace("'","`",$text);
|
====
Пока писал это сообщение, наткнулся на обсуждение на соседнем форуме(http://wapinet.ru/forum/viewprintable.php?id=107) с похожим вопросом. Как я понял из описанного там, данные для внесения в базу, в итоге нужно фильтровать следующим образом.
Я написал функцию, собрав оттуда все предложенные варианты. Итак, это верно? Или что-то упущено, или, наоборот, что-то лишнее?)
<?
function db_connect() {
// здесь подключаемся к БД
}
function secure($str) {
$str=trim(stripslashes(htmlspecialchars($str),ENT_QUOTES));
$str=strtr($str,array("\r"=>' ',"\n"=>' '));
$str=str_replace(array(chr(0),chr(1),chr(2),chr(3),chr(4),chr(5),chr(6),chr(7),
chr(8),chr(9),chr(10),chr(11),chr(12),chr(14),
chr(15),chr(16),chr(17),chr(18),chr(19),chr(20),chr(21),
chr(22),chr(23),chr(24),chr(25),chr(26),chr(27),chr(28),chr(29),chr(30),chr(31)),null,$str);
if(!get_magic_quotes_gpc()) $str=@mysql_real_escape_string($str);
else $str=addslashes($data);
return $str;
}
// ...
// подключаемся к БД
$db=db_connect();
// фильтруем данные
$text=secure($_POST[''text]);
$id=(int)$_POST['id'];
// выполняем mysql запрос
mysql_query("UPDATE secure_table SET text='{$text}' WHERE id='{$id}'");
?>
|
Но как тогда в таком случае записывать в базу html код и выводить его обратно в рабочем виде? Или использовать только bb-теги? | |