PHP表单输入过滤

2 php forms security validation

我是一个PHP新手,正在研究基本的表单验证脚本.我知道输入过滤和输出转义对于安全性原因都至关重要.我的问题是我下面编写的代码是否足够安全?首先澄清一些说明.

  1. 我知道清理和验证之间存在差异.在下面的示例字段中,该字段是纯文本,因此我需要做的就是清理它.
  2. $ clean ['myfield']是我发送给MySQL数据库的值.我正在使用预准备语句进行数据库交互.
  3. $ html ['myfield']是我发送回客户端的值,这样当他/她提交带有无效/不完整数据的表单时,其中包含数据的已清理字段将被重新填充,因此他们不必重新填充从头开始输入所有内容.

这是(略微清理)代码:

$clean = array();
$html = array();
$_POST['fname'] = filter_var($_POST['fname'], FILTER_SANITIZE_STRING);
$clean['fname'] = $_POST['fname'];
$html['fname'] = htmlentities($clean['fname'], ENT_QUOTES, 'UTF-8');
if ($_POST['fname'] == "") {
    $formerrors .= 'Please enter a valid first name.<br/><br/>';
}
else {
    $formerrors .= 'Name is valid!<br/><br/>';
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

〜贾里德

bob*_*nce 5

我知道输入过滤和输出转义对于安全性原因都至关重要.

我想说输出转义对于安全性和正确性原因至关重要,输入过滤是深度防御和强制执行特定应用程序规则的潜在有用措施.

输入过滤步骤和输出转义步骤必然是单独的问题,并且不能组合成一个步骤,尤其是因为存在许多不同类型的输出转义,并且必须为每个输出上下文选择正确的输出(例如HTML-在页面中转义,URL转义以进行链接,SQL转义等等.

不幸的是,PHP在这些问题上传统上非常模糊,因此提供了许多可能误导您的混合消息功能.

在下面的示例字段中,该字段是纯文本,因此我需要做的就是清理它.

是.唉,FILTER_SANITIZE_STRING绝不是一个理智的杀菌者.它完全删除了一些内容(strip_tags这本身就非常不合理),同时HTML转义其他内容.例如,报价变成了&#34;.这是胡说八道.

相反,对于输入消毒,请查看:

  • 检查它是你正在使用的编码的有效字符串(希望是UTF-8;参见例如此正则表达式);

  • 删除控制字符,U + 0000-U + 001F和U + 007F-U + 009F.仅允许新行通过有意识的多行文本字段;

  • 删除不适合用于标记的字符;

  • 对于内容模型比任意文本字符串更具体的数据,验证输入在逐个字段的基础上符合应用程序要求.虽然你的转义应该能够<正确处理一个角色,但是在没有任何意义的领域中尽早摆脱它可能是一个好主意.

对于输出转义一步我一般喜欢htmlspecialchars()htmlentities(),虽然你正确使用的UTF-8参数停止后者的功能在与平常不同的方式打破.