- Context 类接口
- 获取请求路径
- 获取 Query String
- 获取请求方法
- 获取请求协议
- 获取请求头
- 获取请求体
- 获取、修改 session
- 获取请求参数
- 获取请求来源地址
- 获取服务器信息
- 获取Web根目录
- 自定义实例
Context 类接口
Context 类包含当前请求信息和服务器信息
获取请求路径
绝对路径,不包含 Query String
context.path// => '/my/article.jsp'
获取 Query String
返回URL参数
context.querystring// => 'offset=10&size=10'
获取请求方法
字母为小写
context.method// => 'get'
获取请求协议
context.protocol// => 'https'
获取请求头
获取当前请求的headers,其中key的名字均为小写
context.header// => {// 'user-agent': 'Chrome',// 'content-type': 'application/json'// ...// }
获取请求体
仅返回请求体原始数据的前4KB,类型为 ArrayBuffer
因受到服务器限制,插件系统不保证一定能够获取到请求体原始数据。在Java应用下面,只有应用读取了body,插件才能获取到。
context.body// => ArrayBuffer
获取、修改 session
注意
- 这个函数会直接操作 Java / PHP 的 session,请谨慎使用
- 若获取到对象并不是字符串类型,会转换为字符串返回
context.session.setSession('_rasp_username', 'Hello From OpenRASP')console.log(context.session.getSession('_rasp_username'))// Hello From OpenRASP
获取请求参数
对于 java 服务器,当用户已经获取过请求参数的情况下, 我们会返回 ServletRequest.getParameterMap() 的结果,也就是 Map<String, String[]>
当用户还没有获取过任何参数, 我们会返回空对象, 这样做既可以保证用户在获取参数的时候产生乱码, 同时在插件中做用户参数匹配检测过程中也可以降低误报率
// context.querystring = 'offset=10&size=10'// context.body = 'filter=odd'context.parameter// => {// 'offset': ['10'],// 'size': ['10'],// 'filter': ['odd']// }
获取请求来源地址
这个参数只是应用服务器看到的请求来源IP。如果是反向代理部署方式,你可能需要获取 X-Forwarded-For、X-Client-IP 等HTTP响应头数据
context.remoteAddr// => '2.3.3.3'
获取服务器信息
当前服务器的属性,包括服务器类型、开发语言等等
context.server// {// 'name': 'Tomcat / JBoss / Jetty',// 'version': '8',// 'os': 'Linux',// 'language': 'java / php'// }
若要判定是否为 Windows 系统,可使用 context.server.os.indexOf('Windows') == 0
获取Web根目录
对于java服务器,返回 webapps 目录;对于php服务器,返回 webroot
context.appBasePath// => '/home/tomcat/webapps'
自定义实例
在编写单元测试时,若要同时模拟请求信息,可以通过自定义 Context 实例的方式来实现,e.g
var context = new Context()// 自定义 method 参数信息var context = new Context({ getMethod: function() { return 'get' }})
当然,除了请求方法以外,你可还可以自定义其他参数,
如果没有定义某个方法,这个方法将返回 undefined
var context = new Context({ getPath: function(){}, getQuerystring: function(){}, getMethod: function(){}, getProtocol: function(){}, getHeader: function(){}, getParameter: function(){}, getBody: function(){}, getRemoteAddr: function(){}, getServer: function(){}})
原文: https://rasp.baidu.com/doc/dev/api/context.html
