【问题标题】:When don't you sanitize data?你什么时候不清理数据?
【发布时间】:2013-06-01 01:19:50
【问题描述】:

所以我一直在为一个小项目开发一个 API,所有用户输入都不会直接用于 SQL 或显示给用户,所以我需要清理它吗?如果我做了我应该怎么做?

我目前正在检查它们是否为整数、字符串、数组等,但除此之外我还需要做什么吗?

【问题讨论】:

  • 对于数据库使用,如果你使用parametrized statements,你真的不需要清理数据
  • 您权衡可能发生的风险以及发生的可能性。 Security.stackexchange.com 可能会在这个主题上有很好的答案。
  • 理想情况下,您不信任并清理来自用户空间的所有内容.. 以及其他所有内容,您仍然需要加一点盐,并在可能的情况下认为它是可消毒的
  • 好的,所以如果传入的数据不会被放入 SQL 查询或有可能显示给用户,我仍然应该对其进行清理吗?
  • @Rambomst 对于外部 API,请遵循 API 的要求;对于 switch/if 语句,如果您只使用它们进行比较应该是安全的;对于会话键(数组键),只需确保它是有效的字符串/整数。乍一看,您的使用非常“安全”。如果您仍然不确定,请通过一些示例/演示更新问题。

标签: php input sanitize


【解决方案1】:

问题始终是出于什么目的?如果您只是获取从用户那里获得的价值,而不对他们任何事情(您只是存储和显示它们),那么就没有什么需要消毒的了。如果您让这些价值观“主动”某事,您可能需要清理它们以避免他们做您不喜欢的事情。

例如,您接受来自用户的 HTML 输入并想要 HTML 格式的内容,但您想要避免 XSS 问题;在这种情况下,您将需要有选择地删除 HTML 元素,即您想清理输入。

// some HTML is allowed, but not everything
echo remove_unwanted_html_elements($_POST['content']);

如果 OTOH 无论如何都不允许解释 HTML 输入,即用户发布的任何内容都只是按字面意思显示给他,而没有任何被解释为 HTML,那么你不需要清理任何内容。您可能只需要根据其目标格式转义内容。

// don't care what the user enters, just display it right back as is
echo htmlspecialchars($_POST['content']);

仅当您以某种不完全可预测的方式评估值时,清理才有意义。清理意味着获取一个值并将其更改为其他内容,通常是从其中删除某些内容。这必须非常有针对性和目的性,因为它可能是一个非常容易出错的操作;您不只是因为某种原因就以某种方式清理数据。另一种选择是简单的验证,即检查一个值是否符合预期的规范,否则直接拒绝它。

即使将用户输入的假定数字转换为int 也是一种非常简单的清理形式;它是有效的,因为这意味着您可以保证获得一个无害的数字,但该数字可能与用户提交的值无关,也可能无关。 验证在这里可能是更好的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2019-07-24
    • 2012-01-22
    相关资源
    最近更新 更多