首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >输出还是输入过滤?

输出还是输入过滤?
EN

Stack Overflow用户
提问于 2010-10-14 19:23:54
回答 3查看 2.3K关注 0票数 4

输出还是输入过滤?

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

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

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

在我个人看来,这些数据从来都不是很安全的。虽然这听起来很容易,但是只需过滤从表单和url中获得的所有内容,在现实中它要比这难得多,它可能对一种语言是安全的,但对另一种语言可能是安全的。

输出过滤:在这样做的时候,我用准备好的语句将未修改的原始数据保存到数据库中,然后在访问数据时过滤出有问题的代码,这有自己的优点:这在html和服务器端脚本之间增加了一个层。我认为这是一种数据访问分离。

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

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

这并不意味着您不需要进行验证检查,您仍然需要这样做,只是您不保存过滤过的数据,验证它,并在数据无效时向用户提供错误消息。

因此,与其使用“过滤输入”,不如“验证输入,过滤输出”。

那么,我应该使用“输入验证和筛选”还是“输入验证和输出筛选”?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-14 19:31:06

对于输入和输出没有通用的“筛选”。

验证输入,转义输出。如何做到这一点取决于上下文。

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

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

票数 4
EN

Stack Overflow用户

发布于 2010-10-14 19:29:22

最好的解决办法是过滤两者。只做一件事会使你更有可能错过一件案子,并且会让你更容易受到其他类型的攻击。

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

如果只进行输出筛选,则可以避免受到SQL注入和其他服务器端攻击。

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

票数 0
EN

Stack Overflow用户

发布于 2010-10-14 19:29:58

听起来像是语义学。无论哪种方式,重要的是要记住的是确保坏数据不会进入系统。

执行输出过滤而不是输入筛选是在请求SQL注入。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3936774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档