我的网站上有一个表单,它从文本区域获取输入,如果它为空(strlen = 0),则以一种方式处理它,如果它有文本,则另一种方式处理它。以下是表格的一部分:
<form name='contact' action='contact.php' method='post'>
...
Message*<br />
<textarea name='msg' rows='10' cols='70' maxlength='2048'><?php echo $msg ?></textarea><br />
...
<input type='submit' value='Send!' id='subby' name='fatk' style='height:60px; width:300px;' />
</form>
现在的PHP代码:
$msg = isset($_POST['msg'])?safeString($_POST['msg']):'';
$msg = substr($msg,0,2048);
if (strlen($msg) == 0)
echo "<h1>Test failed</h1>";
else { ... }
这是safestring(str)
方法:
function safeString($str) {
htmlentities($str);
htmlspecialchars($str);
}
每次我提交表单时,无论我在 msg 文本区域中放入多少或多少,它总是说它是空的(通过回显测试失败)。另外,您知道我应该在safestring()
功能中添加什么以使我的表单更安全吗?
您不会从 safeString
返回任何内容。
除此之外,safeString
所做的是多余的(htmlentities
是htmlspecialchars
的超集,后者负责防止XSS)。
最后,您真的不应该在接受输入时进行此清理,而应该仅在生成输出时
进行清理。简而言之,您的代码应该看起来更像
$msg = isset($_POST['msg']) ? $_POST['msg'] :'';
if ($msg == '')
echo "<h1>Test failed</h1>";
else {
echo "Received value: ".htmlspecialchars($msg);
}
您还应该明确指定输入的编码(请参阅 htmlspecialchars
的第三个参数)。