Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вопрос по форуму, скаченному с вашего сайта.
 
 автор: man1   (15.04.2012 в 01:24)   письмо автору
 
 

Приветствую всех, скачал ради интереса у вас в разделе веб-приложений самописный форум одного из участников (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-теги?

  Ответить  
 
 автор: man1   (15.04.2012 в 13:32)   письмо автору
 
   для: man1   (15.04.2012 в 01:24)
 

ап. актуально.

  Ответить  
 
 автор: Valick   (15.04.2012 в 14:30)   письмо автору
 
   для: man1   (15.04.2012 в 13:32)
 

просто выбросьте этот форум, вместе с вашей функцией
и начинайте наконец читать книги

  Ответить  
 
 автор: man1   (15.04.2012 в 19:27)   письмо автору
 
   для: Valick   (15.04.2012 в 14:30)
 

Интересный совет. Но все же?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования