PHP 表单输入过滤

标签 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/>';
}

感谢您的帮助!

~贾里德

最佳答案

I understand that input filtering and output escaping are both vital for security reasons.

我想说的是,出于安全性和正确性原因,输出转义至关重要,而输入过滤对于纵深防御和执行特定应用程序规则可能是有用的措施。

输入过滤步骤和输出转义步骤必然是独立的关注点,不能合并为一个步骤,尤其是因为有许多不同类型的输出转义,必须为每个输出上下文选择正确的一个(例如,页面中的 HTML 转义、URL 转义以建立链接、SQL 转义等)。

不幸的是,PHP 传统上对这些问题非常模糊,因此提供了一堆可能会误导您的混合消息函数。

In the example field below, the field is plain text, so all I need to do is sanitize it.

是的。唉,FILTER_SANITIZE_STRING无论如何都不是一种理智的 sanitizer 。它完全删除了一些内容( strip_tags ,这本身是非常不明智的)同时对其他内容进行 HTML 转义。例如引号变成&#34; .这是胡说八道。

相反,对于输入清理,请查看:

  • 检查它是否是您正在使用的编码的有效字符串(希望是 UTF-8;参见例如 this regex);

  • 删除控制字符 U+0000–U+001F 和 U+007F–U+009F。仅在有意的多行文本字段中允许换行符;

  • 删除 not suitable for use in markup 的字符;

  • 对于内容模型比任意文本字符串更具体的数据,逐个字段地验证输入是否符合应用程序要求。尽管您的转义应该处理 <字符正确,在没有意义的领域尽早摆脱它可能是个好主意。

对于输出转义步骤,我通常更喜欢 htmlspecialchars()htmlentities() , 尽管您正确使用了 UTF-8参数阻止后一个函数以通常的方式中断。

关于PHP 表单输入过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8719923/

相关文章:

php - 如何在 PHPUnit 中获取确定的调用方法的数量

php - MySQL错误连接mysql失败

forms - 如何在标签上标注必填字段的星号? (Symfony 形式)

javascript - 当您提交表单时,单击的按钮是否也会发布?

php - 通过 url 保护对文件和文件夹的访问

security - SSL 的替代品

php 输入字段显示为 Integer

php - 用 cakephp 保存相对值

php - 表单中相同元素的多个实例

javascript - 我的 JavaScript 安全性如何?它被利用的容易程度如何?