【问题标题】:Filtering user input - clarification needed过滤用户输入 - 需要澄清
【发布时间】:2010-09-05 03:28:54
【问题描述】:

我想澄清一下用 php.ini 过滤用户输入的正确方法是什么。例如,我有一个用户输入信息的 Web 表单。提交后,表单中的数据将被输入数据库。

我的理解是你不想清理进入数据库的数据,除了转义它,比如 mysql_escape_string,你想在前端使用 htmlentities 或 htmlspecialchars 显示它时对其进行清理。但是,如果您愿意,您可以在用户提交表单时验证/过滤用户输入,以确保数据格式正确,例如字段是否用于您要验证其具有正确电子邮件格式的电子邮件地址。对吗?

我的下一个问题是,当您在 Web 表单中重新显示数据时,您会如何处理这些数据?假设用户在填写表格并将信息添加到数据库后可以编辑该表格中的信息。然后他们返回并查看他们最初输入的字段中的数据,您是否必须清理数据才能使其在表单字段中正确显示?比如有一个字段叫我的职称,输入我的职称的人​​是“经理”。您会看到经理周围的引号,当您将其按原样显示到表单字段中时,它会因为引号而中断:

<input type="text" name="title" value="My title is "Manager"">

所以你不必做类似 htmlentities 之类的事情来将引用转换为它的 html 实体吗?否则,该字段的值将类似于 My title is

希望这是有道理的。

【问题讨论】:

    标签: php validation filter sanitization


    【解决方案1】:

    没有什么说您不能在插入数据库之前清理数据。毕竟,如果您的脚本/站点/公司对表单字段中可接受的内容有特定的政策,最好在保存之前删除任何不允许的内容。这样,您只需在数据插入/更新之前清理一次,而不是每次检索数据。

    如果您允许(比如说)重音字符的 HTML 实体,但不允许 HTML 标签,那么您必须同时检查无效实体 (&amp;foobar;?) 和 HTML 标签。既然您不允许它们,请不要费心存储它们。如果您需要有效的电子邮件地址,请检查它是否符合 RFC 5322,并且仅在用户输入正确数据后才存储它。 (该电子邮件地址是否真的存在是另一回事)。

    现在,让我们弄清楚一件事。消毒和逃跑是有区别的。清理的字面意思是清理——你正在从数据中删除任何你不想要的东西。您可以静默删除它,也可以向用户显示错误并告诉他们修复它。另一方面,转义只是一种编码数据的方法,因此可以正确显示。

    使用您的My title is "Manager" 字符串,您无需对其进行清理,因为它并没有什么真正的错误或冒犯性。您需要做的是至少使用htmlspecialchars() 对其进行转义,以便嵌入的双引号不会“破坏”您的表单。如果您逐字嵌入它,大多数浏览器会将其视为具有value="My title is" 和一些虚假属性/垃圾Manager""。所以,你通过 htmlspecialchars 运行它并最终得到My title is &amp;quot;Manager&amp;quot;,它完美地嵌入到value="" 中,没有任何问题。没有消毒,只是适当的编码。

    现在,当提交该表单时,您必须再次进行清理/验证,因为数据已掌握在潜在恶意用户手中,并且数据可能已更改为 My title is &lt;script&gt;document.location='http://attacksite.com';&lt;/script&gt;pwn me

    基本上,工作流程应该是:

    1. 向用户展示表单
    2. 获取提交的数据。
    3. 清理数据
    4. 如果表格填写不正确,显示错误并转到 1)
    5. 为 sql 查询转义数据
    6. 插入数据库

    后来

    1. 从数据库中检索数据
    2. 转义/编码以适应显示方式
    3. 显示数据。如果数据要进入表单,请像以前一样执行 1-6。

    【讨论】:

    • 感谢您的回复!我认为我主要关心的是数据库中出现奇怪的字符,尤其是在我清理 utf8 字符串时。
    • 解释得很好!我想知道为什么答案没有收到任何赞成票。
    猜你喜欢
    • 2012-02-21
    • 2015-12-22
    • 2012-12-05
    • 2022-01-04
    • 1970-01-01
    • 2015-06-29
    • 2011-11-09
    • 2012-07-18
    • 1970-01-01
    相关资源
    最近更新 更多