PHP 表单将 HTML 特殊字符作为纯文本发布



我有一个基本表单,可以通过PHP向数据库提交注释,并通过AJAX将它们显示在页面上,一切正常,但问题是简单的HTML代码(如<script>alert('Message')</script><h1>Hi!</h1>(显示有效的HTML,并由客户端执行。

经过研究,我发现 PHPhtmlspecialchars()函数可以阻止 XSS 代码被执行:

<form method="post" action="<?PHP echo htmlspecialchars($_SERVER['PHP_SELF']);?>" onsubmit="return post();">
<textarea id="comment"></textarea>
<input type="submit" value="Submit">
</form>

处理表单的 PHP 文档是这样的:

<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
$host="localhost";
$username="user";
$password="password";
$databasename="comments";
$connect=mysql_connect($host,$username,$password);
$db=mysql_select_db($databasename);
if(isset($_POST['user_comm']))
{
$comment = mysql_real_escape_string($_POST['user_comm']);
$insert=mysql_query("insert into comments values('','$comment',CURRENT_TIMESTAMP)");
$id=mysql_insert_id();
$select=mysql_query("select comment,post_time from comments where comment='$comment' and id='$id'");
if($row=mysql_fetch_array($select))
{
$comment = mysql_real_escape_string($row['comment']);
$time=$row['post_time'];
?>
<div class="comment_div"> 
<p class="comment"><?php echo stripslashes($comment);?></p>   
<p class="time"><?php echo date('l d M Y - H:i a', strtotime($time));?></p>
</div>
<?php
}
exit;
}
?>

但就我而言,这是行不通的,并且在发送消息后,Javascript 代码仍然由客户端执行。如何在注释中将 HTML 特殊字符显示为纯文本以防止这种情况?

htmlspecialchars(( 用它们的 html 代码替换特殊字符,就像&lt;=">

保护表单的动作没有意义,保护你的评论的显示:

<p class="comment"><?php echo htmlspecialchars($comment);?></p>

htmlspecialchars(( 用编码版本替换 HTML 特殊字符,例如<替换为&lt;>

除了保护表单的"操作"外,您还需要使用它来编码任何输入变量,这些变量的数据稍后可能会注入屏幕上的 HTML 中。

对值进行编码的好时机是在将它们插入数据库之前,这样以后任何时候使用该数据都不再是一种危险。

因此,在您的示例中,您只有"注释"字段,因此您可以在准备数据库插入之前对其进行如下编码:

$comment = htmlspecialchars($_POST['user_comm']);
$comment = mysql_real_escape_string($comment);

:注:请注意我关于使用mysql_query和相关功能的评论(在上面的主要评论部分(。您不应该将它们用于任何新代码,对于旧代码,您应该计划替换它。尽快切换到受支持的库。

最新更新