Web 应用程序安全指南/(非)可信输入
外观
所有用户输入都应视为不可信。看似“可信/安全”的输入,比如PHP中的一些$_SERVER变量,很容易被攻击者操控。
为了防止此类攻击
- 彻底过滤/转义任何不可信内容
- 如果某些输入字段允许的字符集有限,请在使用之前检查输入是否有效
- 如果对某些类型的数据(例如服务器变量)存在疑问,请将其视为不可信
- 如果您确定,但实际上并不需要将其视为可信,请将其视为不可信
- 请求URL(例如在环境变量中)不可信
- 来自HTTP头的數據不可信
- Referer
- X-Forwarded-For
- Cookies
- 服务器名称(!)
- 所有POST和GET数据都不可信
- 包括非用户可修改的输入字段,如select
- 所有内容验证都应在服务器端进行
基本原理
转义或过滤不应该包含任何需要转义的字符的“可信”输入只会带来微不足道的性能损失,但如果输入被证明不可信,你将处于安全的一方。
使用字符白名单验证输入数据可以避免使用意外字符(空字节、UTF-8、内部表示中用作分隔符的控制字符等)进行的攻击。确保您的验证不要过于严格,例如,您需要在人名字段中允许UTF-8和'之类的字符。
攻击者不受浏览器对其施加的约束。即使输入字段被指定为maxlength=20
,也不意味着攻击者不能创建包含200KB数据的请求。对于任何基于JavaScript的约束也是如此。