(Un)trusted input

所有用户输入都应视为不可信。看似“可信/安全”的输入,比如PHP中的一些$_SERVER变量,很容易被攻击者操控。

为了防止此类攻击

彻底过滤/转义任何不可信内容

如果某些输入字段允许的字符集有限,请在使用之前检查输入是否有效

如果对某些类型的数据(例如服务器变量)存在疑问,请将其视为不可信

如果您确定,但实际上并不需要将其视为可信,请将其视为不可信

请求URL(例如在环境变量中)不可信

来自HTTP头的數據不可信Referer

X-Forwarded-For

Cookies

服务器名称(!)

所有POST和GET数据都不可信包括非用户可修改的输入字段,如select

所有内容验证都应在服务器端进行

基本原理

转义或过滤不应该包含任何需要转义的字符的“可信”输入只会带来微不足道的性能损失,但如果输入被证明不可信,你将处于安全的一方。

使用字符白名单验证输入数据可以避免使用意外字符(空字节、UTF-8、内部表示中用作分隔符的控制字符等)进行的攻击。确保您的验证不要过于严格,例如,您需要在人名字段中允许UTF-8和'之类的字符。

攻击者不受浏览器对其施加的约束。即使输入字段被指定为maxlength=20,也不意味着攻击者不能创建包含200KB数据的请求。对于任何基于JavaScript的约束也是如此。

vteWeb 应用程序安全指南

主书页 | 简介 | 清单

其他要点 | 文件包含和披露 | 文件上传漏洞 | SQL 注入 | 跨站脚本(XSS) | XML 和内部数据转义 | XML、JSON 和通用 API 安全 | (Un)trusted input | 跨站请求伪造(CSRF) | 点击劫持 | 不安全的數據傳輸 | 会话固定 | 会话窃取 | 截断攻击,修剪攻击 | 密码安全 | 比较问题 | PHP 特定问题 | 预取和蜘蛛 | 特殊文件 | SSL、TLS 和 HTTPS 基础

进一步阅读 | 作者 | 印刷版