代码之家  ›  专栏  ›  技术社区  ›  Timo Huovinen

输出或输入过滤?

  •  4
  • Timo Huovinen  · 技术社区  · 14 年前

    我经常看到有人写“过滤你的输入”、“清理你的输入”,不信任用户数据,但我只同意最后一个,我认为信任任何外部数据是一个坏主意,即使它是相对于系统的内部数据。

    输入过滤: 我看到的最常见的。 以表单post数据或任何其他外部信息源为例,在保存时定义一些边界,例如确保文本是文本,数字是数字,sql是有效的sql,html是有效的html并且不包含有害的标记,然后将“安全”数据保存在数据库中。

    在我个人看来,这些数据从来就不是真正安全的。 虽然听起来很简单,但是只要过滤表单和url中的所有内容,实际上要比这困难得多,对于一种语言可能是安全的,而不是另一种语言。

    输出过滤: 这样做时,我将原始的未经修改的数据(不管是什么)与准备好的语句一起保存到数据库中,然后在访问数据时过滤掉有问题的代码,这有它自己的优点: 这将在html和服务器端脚本之间添加一个层。 我认为这是数据访问分类。

    现在,根据上下文过滤数据,例如,我可以将数据库中的数据以纯转义文本、html或任何形式显示在html文档中。

    这里的缺点是,您永远不能忘记添加过滤,这比输入过滤要难一点,而且它在提供数据时使用更多的CPU。

    所以,与其用“过滤你的输入”,不如用“验证你的输入,过滤你的输出”。

    那么我应该使用“输入验证和过滤”还是“输入验证和输出过滤”?

    3 回复  |  直到 14 年前
        1
  •  4
  •   user229044    14 年前

    输入和输出没有通用的“过滤”。

    验证的目的是确保输入在合理的范围内,比如字符串的长度、美元金额的数字性,或者正在更新的记录是由执行更新的用户拥有的。这是为了保持数据的逻辑一致性,防止人们做一些事情,比如将他们购买的产品的价格归零,或者删除他们不应该访问的记录。它与“过滤”或转义输入中的特定字符无关。

    转义是一个上下文问题,只有在处理可能被注入某些字符所毒害的数据时才真正有意义。转义发送到浏览器的数据中的HTML字符。转义发送到数据库的数据中的SQL字符。在JavaScript中写入数据时转义引号 <script> 标签。只要意识到你正在处理的数据将如何被你传递给它的系统解释,并相应地转义。

        2
  •  0
  •   Alan Geleynse buhbang    14 年前

    最好的办法是两者都过滤掉。只做一个会让你更容易漏掉一个案子,并且会让你面临其他类型的攻击。

    如果只进行输入筛选,攻击者可能会找到绕过输入并导致漏洞的方法。这可能是有权访问数据库的人手动输入数据,也可能是攻击者通过FTP或其他未经检查的通道或许多其他方法上载文件。

    如果您只做输出过滤,那么您可能会面临SQL注入和其他服务器端攻击。

    最好的方法是过滤输入和输出。它可能会导致更多的负载,但大大降低了攻击者发现漏洞的风险。

        3
  •  -1
  •   Byron Whitlock    14 年前

    听起来像语义学。不管怎样,重要的是要记住确保坏数据不会进入系统。

    执行输出过滤而不是输入过滤需要SQL注入。

    alt text