php – 输出或输入过滤?

输出或输入过滤?

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

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

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

在我个人看来,数据永远不会真正安全.
虽然这听起来很简单,但只需过滤从表单和网址获得的所有内容,实际上它比这更难,它可能对一种语言安全而不是另一种语言.

输出过滤:
当这样做时,我将原始未更改的数据(无论它是什么)保存到数据库中,然后在访问数据时过滤掉有问题的代码,这有其自身的优点:
这在html和服务器端脚本之间添加一个层.
我认为是各种数据访问分离.

现在根据上下文过滤数据,例如,我可以将数据库中的数据作为普通转义文本显示在html文档中,或者作为html或任何地方的任何内容.

这里的缺点是你绝不能忘记添加比输入过滤更难的过滤,并且在提供数据时它会使用更多的cpu.

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

因此,不应该使用“过滤输入”,而应该是“验证输入,过滤输出”.

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

解决方法:

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

验证输入,转义输出.你如何做到这一点取决于具体情况.

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

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

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...