本文主要介绍,如何通过编写规则,对提交到WEB服务器的JSON格式的数据进行检测。
前提:服务器中需要安装yajl-devel,且ModSecurity需要在其后再进行编译安装。
默认情况下,ModSecurity将使用URLENCODED和MULTIPART解析器分别处理application/x-www-form-urlencoded和multipart/form-data类型的请求体,如要对JSON格式的数据进行解析并检测,需要临时更改解析器,如下方规则所示:
SecRule REQUEST_HEADERS:Content-Type "application/json" \ "id:100,phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON"
上述规则表示,如果请求头中Content-Type的值为"application/json",则临时将请求体的解析器改为JSON解析器。
此时,我们可以修改Content-Type为"application/json",然后POST以下数据到服务器进行测试:
{ "Image": { "Width": 800, "Height": 600, "Title": "View from 15th Floor", "Thumbnail": { "Url": "http://www.example.com/image/481989943", "Height": 125, "Width": "100" }, "IDs": ["116", "943", "234", "ABC"] } }
提交后,在ModSecurity的Debug日志中,我们可以观察到以下内容:
上图中表示,ModSecurity已成功解析JSON数据,并在内存中创建了对应的变量,如创建变量Image.Width为800、Image.Height为600,创建集合Image.IDs,集合中的值分别为"116","943","234","ABC"。
此时,我们可以编写规则对指定的参数进行判断:
#对Image.Width的值进行判断,如果大于200,则阻断此次访问 SecRule ARGS:Image.Width "@gt 200" "phase:2,log,id:101,deny,msg:'Json param image.width gt 200'" #对Image.IDs集合中的值进行判断,如果存在不是数字的参数,则阻断此次访问 SecRule ARGS:Image.IDs.IDs "!@rx ^[0-9]*$" "phase:2,log,id:102,deny,msg:'ID is not number'"
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。