php экранирование ввода пользователя для отображения в html - PullRequest
1 голос
/ 24 апреля 2011

php page1 -> нижний бит - чистый html:

<form action="page2.php" method="post">
<input type="text" name="name" id="name">
-----------submit button, end form --etc.--------------

php page2 (и да, я намеревался вставить текстовый ввод со страницы1 в скрытый ввод на странице2):

foreach($_REQUEST as $key=>$value) 
{
     $value = htmlspecialchars(strip_tags(stripslashes($value))); //attempt to cleanse the data before displaying
}
echo "<p><input type='hidden' id='name' name='name' value='".$_REQUEST['name']."'/>".$_REQUEST['name']."</p>";

Проблема состоит в том, что вывод на странице 2 не производит w3-совместимый HTML, если пользователь вводит данные с кавычками, такими как Джон О'Брайен, HTML становится:

<p><input type='hidden' id='email' name='email' value='John O'Brien'/>John O'Brien</p>

Я бы тожехотел бы иметь возможность создавать w3-совместимый html для любых неверных входных данных, таких как: j'o / h \ ns "m, ith

Любая помощь приветствуется!

Ответы [ 4 ]

2 голосов
/ 24 апреля 2011

Используйте параметр ENT_QUOTES для htmlspecialchars():

$value = htmlspecialchars(strip_tags(stripslashes($value)), ENT_QUOTES);
0 голосов
/ 24 апреля 2011
  • Прежде всего, ни ваш код, ни любой из вышеперечисленных не будут работать. По очень глупой причине.
  • Далее, я немного зациклен на сохранении пользовательского ввода в том виде, в каком оно есть. Почему удалить что-то может быть важно?
  • В-третьих, я полагаю, что скрытые значения должны быть кодированы в кодировке htmlencoded

так

$FORM = array();
foreach($_POST as $key =>$value) {
    if(get_magic_quotes_gpc()) {
        $value = stripslashes($value);
    }
    $FORM[$key] = htmlspecialchars($value,ENT_QUOTES);
}
echo "<p><input type='hidden' id='name' name='name' value='".$FORM['name']."'/>".
          $FORM['name'].
     "</p>";
0 голосов
/ 24 апреля 2011

Лично я бы не стал использовать $_REQUEST - книга Essential PHP Security Криса Шиффлета предполагает, что это может сделать ваше приложение уязвимым для CSRF-атак .

Далее, в зависимости от конфигурации сервера, вы не можете иметь для вызова stripslashes(...) - см. magic_quotes_gc ini-конфигурацию .Я бы использовал get_magic_quotes_gpc(), чтобы определить, если это необходимо.

foreach($_REQUEST as $key=>$value) {
    if(get_magic_quotes_gpc()) {
        $value = stripslashes($value);
    }
     $value = htmlspecialchars(strip_tags($value));
}
echo "<p><input type='hidden' id='name' name='name' value='".$_REQUEST['name']."'/>".$_REQUEST['name']."</p>";
0 голосов
/ 24 апреля 2011
foreach($_REQUEST as &$value) 
{
     $value = addslashes(htmlspecialchars(strip_tags($value)));
}
echo "<p><input type='hidden' id='name' name='name' value='".$_REQUEST['name']."'/>".$_REQUEST['name']."</p>";
...