PHP转义用户输入以显示在html中


php escaping user input to display in html

php page1 -->以下位为纯html:

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

php page2(是的,我打算将page1的文本输入填充到page2的隐藏输入中):

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,如果用户输入带有引号的输入,如John O'Brien,则html变为:

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

我还希望能够为任何错误的输入数据生成w3兼容的html,例如:j'o/h'n s ' m,ith

任何帮助都是感激的!

使用ENT_QUOTES选项到htmlspecialchars():

$value = htmlspecialchars(strip_tags(stripslashes($value)), ENT_QUOTES);

就我个人而言,我不会使用$_REQUEST - Chris Shifflet的《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>";
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>";
    首先,不是你的代码,也不是上面发布的任何代码都能正常工作。因为一个非常愚蠢的原因。
  • 接下来,我有点专注于保留用户输入。为什么要删除一些可能很重要的东西?
  • 第三,我认为隐藏值应该是urlencoded,而不是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>";