ADC

表单字段一致性检查

表单字段一致性检查会检查网站用户返回的 Web 表单,并验证客户端是否对 Web 表单进行了不当修改。此检查仅适用于包含 Web 表单(包含或不包含数据)的 HTML 请求。它不适用于 XML 请求。

表单字段一致性检查可防止客户在填写和提交表单时对您网站上的 Web 表单结构进行未经授权的更改。它还可以确保用户提交的数据符合长度和类型的 HTML 限制,并且隐藏字段中的数据不会被修改。这可以防止攻击者篡改 Web 表单并使用修改后的表单来获得对网站的未经授权的访问权限,重定向使用不安全脚本的联系表单的输出从而发送未经请求的批量电子邮件,或者利用 Web 服务器软件中的漏洞来控制 Web 服务器或底层操作系统。Web 表单是许多网站上的薄弱环节,会吸引各种各样的攻击。

表单字段一致性检查可验证以下所有内容:

  • 如果向用户发送了字段,则检查会确保该字段由用户返回。
  • 该检查强制执行 HTML 字段长度和类型。

    注意:

    • 表单字段一致性检查强制执行 HTML 对数据类型和长度的限制,但不以其他方式验证 Web 表单中的数据。您可以使用“字段格式”检查设置用于验证 Web 表单上特定表单字段中返回的数据的规则。

    • 表单字段一致性保护会在发送给客户端的响应表单中插入隐藏字段“as_fid”。当客户提交表单时,ADC 将删除相同的隐藏字段。如果有客户端 javascript 对表单字段进行校验和计算并在后端验证相同的校验和,则可能会导致应用程序损坏。在这种情况下,建议从客户端 javascript 校验和计算中放松应用程序防火墙表单字段一致性隐藏字段“as_fid”。

  • 如果您的 Web 服务器不向用户发送字段,则该检查不允许用户添加该字段并在其中返回数据。
  • 如果字段是只读字段或隐藏字段,则检查会验证数据是否未更改。
  • 如果字段是列表框或单选按钮字段,则复选框会验证响应中的数据是否与该字段中的某个值相对应。

如果用户返回的 Web 表单冲突了一个或多个表单字段一致性检查,并且您尚未将 Web App Firewall 配置为允许该 Web 表单冲突表单字段一致性检查,请求将被阻止。

如果您使用向导或 GUI,则在“修改表单字段一致性”对话框中的“常规”选项卡上,您可以启用或禁用“阻止”、“日志”、“学习”和“统计”操作。

您还可以在“常规”选项卡中配置无会话字段一致性。如果启用了无会话字段一致性,Web App Firewall 将仅检查 Web 表单结构,而无需检查表单字段一致性检查中依赖于维护会话信息的部分。这可以加快表单字段一致性检查的速度,而对于使用多种表单的网站来说,安全损失很小。要在所有 Web 表单上使用无会话字段一致性,请选择启用。要仅将其用于使用 HTTP POST 方法提交的表单,请选择 PostOnly

如果您使用命令行界面,则可以输入以下命令来配置表单字段一致性检查:

  • set appfw profile <name> -fieldConsistencyAction [**block**] [**learn**] [**log**] [**stats**] [**none**]

要为表单字段一致性检查指定宽松,必须使用 GUI。在“修改表单字段一致性复选”对话框的“检查”选项卡上,单击“添加”以打开“添加表单字段一致性检查放宽”对话框,或选择现有的放宽,然后单击“打开”打开“修改表单字段一致性检查放宽”对话框。任何一个对话框都提供了相同的配置放宽选项,如 使用 GUI 手动配置中所述。

以下是表单字段一致性检查放宽的示例:

表单字段名称

  • 选择名称为 userType 的表单字段:

     ^UserType$
     <!--NeedCopy-->
    
  • 选择名称以 userType_ 开头的表单字段,后跟一个以字母或数字开头的字符串,由一到二十一个字母、数字或撇号或连字符组成:

     ^UserType_[0-9A-Za-z][0-9A-Za-z'-]{0,20}$
     <!--NeedCopy-->
    
  • 选择名称以 Turkish-userType_ 开头的表单字段,在其他方面与之前的表达式相同,唯一的不同是它们可以包含土耳其语特殊字符:

     ^T\xC3\xBCrk\xC3\xA7e-UserType_([0-9A-Za-z]|\x[0-9A-Fa-f][0-9A-Fa-f])+$
     <!--NeedCopy-->
    

    注意:

    有关支持的特殊字符以及如何正确 编码它们的完整说明,请参阅 PCRE 字符编码格 式。

  • 选择以字母或数字开头的表单字段名称,仅由字母和/或数字组合组成,并且包含字符串中任意位置的字符串 Num:

     ^[0-9A-Za-z]\*Num[0-9A-Za-z]\*$
     <!--NeedCopy-->
    

表单字段操作 URL

  • 在查询后选择以任何字符串开头 http://www.example.com/search.pl? 并包含除新查询之外的任何字符串的 URL:

     ^http://www[.]example[.]com/search[.]pl?[^?]*$
     <!--NeedCopy-->
    
  • 选择以开头且路径 http://www.example-español.com 和文件名由大写和小写字母、数字、非 ASCII 特殊字符和路径中选定符号组成的 URL。n 字符和任何其他特殊字符均表示为编码的 UTF-8 字符串,其中包含分配给 UTF-8 字符集中每个特殊字符的十六进制代码:

     ^http://www[.]example-espa\xC3\xB1ol[.]com/(([0-9A-Za-z]|\x[0-9A-Fa-f][0-9A-Fa-f])
     ([0-9A-Za-z_-]|\x[0-9A-Fa-f][0-9A-Fa-f])\*/)\*([0-9A-Za-z]|\x[0-9A-Fa-f][0-9A-Fa-f])
     ([0-9A-Za-z_-]|\x[0-9A-Fa-f][0-9A-Fa-f])*[.](asp|htp|php|s?html?)$
     <!--NeedCopy-->
    
  • 选择所有包含字符串 /search.cgi? 的 URL:

     ^[^?<>]\*/search[.]cgi?[^?<>]\*$
     <!--NeedCopy-->
    

小心:

正则表达式非常强大。特别是如果您不太熟悉 PCRE 格式的正则表达式,请仔细检查您编写的任何正则表达式。确保他们准确地定义了要作为例外添加的URL,而不是其他任何内容。粗心地使用通配符,尤其是点星号 (.*) 元字符/通配符组合,可能会产生您不希望或期望的结果,例如阻止访问您不打算阻止的 Web 内容,或允许 Cookie 一致性检查会产生的攻击阻止。

表单字段一致性检查