跳至内容

Web 应用程序安全指南/(非)可信输入

来自维基教科书,开放书籍,开放世界

(Un)trusted input

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

为了防止此类攻击

  • 彻底过滤/转义任何不可信内容
  • 如果某些输入字段允许的字符集有限,请在使用之前检查输入是否有效
  • 如果对某些类型的数据(例如服务器变量)存在疑问,请将其视为不可信
  • 如果您确定,但实际上并不需要将其视为可信,请将其视为不可信
  • 请求URL(例如在环境变量中)不可信
  • 来自HTTP头的數據不可信
    • Referer
    • X-Forwarded-For
    • Cookies
    • 服务器名称(!)
  • 所有POST和GET数据都不可信
    • 包括非用户可修改的输入字段,如select
  • 所有内容验证都应在服务器端进行

基本原理

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

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

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

华夏公益教科书