• Context 类接口
    • 获取请求路径
    • 获取 Query String
    • 获取请求方法
    • 获取请求协议
    • 获取请求头
    • 获取请求体
    • 获取、修改 session
    • 获取请求参数
    • 获取请求来源地址
    • 获取服务器信息
    • 获取Web根目录
    • 自定义实例

    Context 类接口

    Context 类包含当前请求信息和服务器信息

    获取请求路径

    绝对路径,不包含 Query String

    1. context.path
    2. // => '/my/article.jsp'

    获取 Query String

    返回URL参数

    1. context.querystring
    2. // => 'offset=10&size=10'

    获取请求方法

    字母为小写

    1. context.method
    2. // => 'get'

    获取请求协议

    1. context.protocol
    2. // => 'https'

    获取请求头

    获取当前请求的headers,其中key的名字均为小写

    1. context.header
    2. // => {
    3. // 'user-agent': 'Chrome',
    4. // 'content-type': 'application/json'
    5. // ...
    6. // }

    获取请求体

    仅返回请求体原始数据的前4KB,类型为 ArrayBuffer

    因受到服务器限制,插件系统不保证一定能够获取到请求体原始数据。在Java应用下面,只有应用读取了body,插件才能获取到。

    1. context.body
    2. // => ArrayBuffer

    获取、修改 session

    注意

    • 这个函数会直接操作 Java / PHP 的 session,请谨慎使用
    • 若获取到对象并不是字符串类型,会转换为字符串返回
      1. context.session.setSession('_rasp_username', 'Hello From OpenRASP')
      2. console.log(context.session.getSession('_rasp_username'))
      3. // Hello From OpenRASP

    获取请求参数

    对于 java 服务器,当用户已经获取过请求参数的情况下, 我们会返回 ServletRequest.getParameterMap() 的结果,也就是 Map<String, String[]>

    当用户还没有获取过任何参数, 我们会返回空对象, 这样做既可以保证用户在获取参数的时候产生乱码, 同时在插件中做用户参数匹配检测过程中也可以降低误报率

    1. // context.querystring = 'offset=10&size=10'
    2. // context.body = 'filter=odd'
    3. context.parameter
    4. // => {
    5. // 'offset': ['10'],
    6. // 'size': ['10'],
    7. // 'filter': ['odd']
    8. // }

    获取请求来源地址

    这个参数只是应用服务器看到的请求来源IP。如果是反向代理部署方式,你可能需要获取 X-Forwarded-ForX-Client-IP 等HTTP响应头数据

    1. context.remoteAddr
    2. // => '2.3.3.3'

    获取服务器信息

    当前服务器的属性,包括服务器类型、开发语言等等

    1. context.server
    2. // {
    3. // 'name': 'Tomcat / JBoss / Jetty',
    4. // 'version': '8',
    5. // 'os': 'Linux',
    6. // 'language': 'java / php'
    7. // }

    若要判定是否为 Windows 系统,可使用 context.server.os.indexOf('Windows') == 0

    获取Web根目录

    对于java服务器,返回 webapps 目录;对于php服务器,返回 webroot

    1. context.appBasePath
    2. // => '/home/tomcat/webapps'

    自定义实例

    在编写单元测试时,若要同时模拟请求信息,可以通过自定义 Context 实例的方式来实现,e.g

    1. var context = new Context()
    2. // 自定义 method 参数信息
    3. var context = new Context({
    4. getMethod: function() {
    5. return 'get'
    6. }
    7. })

    当然,除了请求方法以外,你可还可以自定义其他参数,

    如果没有定义某个方法,这个方法将返回 undefined

    1. var context = new Context({
    2. getPath: function(){},
    3. getQuerystring: function(){},
    4. getMethod: function(){},
    5. getProtocol: function(){},
    6. getHeader: function(){},
    7. getParameter: function(){},
    8. getBody: function(){},
    9. getRemoteAddr: function(){},
    10. getServer: function(){}
    11. })

    原文: https://rasp.baidu.com/doc/dev/api/context.html