输出或输入过滤?

我经常看到人们写“过滤您的输入”,“消毒您的输入”,不信任用户数据,但是我只同意最后一个,即使我认为任何外部数据也是一个坏主意,即使它是内部的,系统。

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

但是,当获取数据时,您只需使用数据库中的原始数据即可。

我个人认为,数据永远不会真正安全。尽管听起来很容易,但只需过滤您从表单和URL中获得的所有内容,实际上它比这要难得多,它可能对一种语言而不是另一种语言安全。

输出过滤:在这样做时,我保存原始的未更改数据,无论它可能是什么,都将准备好的语句进入数据库,然后在访问数据时滤除有问题的代码,这具有自身的优势:这在HTML和服务器端脚本之间添加了一层。我认为是数据访问分离。

现在,根据上下文对数据进行过滤,例如,我可以将HTML文档中呈现的数据库中的数据(作为普通埃式文本)或HTML或任何地方的任何东西都提供。

这里的缺点是,您必须永远不会忘记添加比输入过滤要困难的过滤,并且在提供数据时会使用更多的CPU。

这并不意味着您不需要进行验证检查,而是您仍然这样做,而是您不保存过滤数据,验证它并为用户提供错误消息,如果数据以某种方式无效。

因此,与其进行“过滤输入”,也许应该是“验证输入,而是过滤输出”。

因此,我应该使用“输入验证和过滤”或“输入验证和输出过滤”?

有帮助吗?

解决方案

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

验证您的输入,逃脱输出。您如何做到这取决于上下文。

验证是关于确保输入属于明智的范围,例如字符串的长度,美元金额的数值或正在更新的记录均由执行更新的用户拥有。这是关于保持数据的逻辑一致性,并阻止人们做诸如零购买的产品价格或删除他们不应访问的记录。它与输入中的“过滤”或逃避特定字符无关。

逃脱是一个上下文问题,只有当您用可以通过注入某些字符毒害的数据做某事时才真正有意义。逃脱发送到浏览器的数据中的HTML字符。逃脱发送到数据库中的数据中的SQL字符。当您在JavaScript中编写数据时逃脱报价 <script> 标签。只要意识到您要处理的数据将如何被您传递给它的系统解释并相应地逃脱。

其他提示

最好的解决方案是两个过滤。只做一个使您更有可能错过案例,并且可以让您对其他类型的攻击敞开。

如果仅进行输入过滤,攻击者可以找到一种绕过输入并引起漏洞的方法。这可能是可以手动输入数据的数据库的人,它可能是攻击者通过FTP上传文件或其他未检查的其他频道或许多其他方法。

如果仅进行输出过滤,则可以让自己对SQL注入和其他服务器侧攻击开放。

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

对我来说听起来像是语义。无论哪种方式,要记住的重要事情都是确保不良数据不会进入系统。

进行输出过滤而不是输入过滤是要求注入SQL。

alt text

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top