RASP 类接口

所有插件需要实例化一个 RASP 对象,并在此对象上注册各检测点对应的检测程序

创建实例

创建 RASP 实例需传入插件名,e.g demo

  1. var plugin = new RASP('demo')

获取JS引擎名称

  1. var name = plugin.get_jsengine()
  2. // 返回 rhino / v8

修改配置

注意: PHP 版本目前不支持此接口

这个接口会修改配置,但是不会更新 rasp.properties 配置文件

  1. RASP.config_set('reflection.monitor', 'java.lang.ProcessBuilder.start, ...')

修改后,会在 <app_home>/rasp/logs/rasp.log 里打印日志,

  1. 2017-12-18 20:51:30,934 INFO [main] configuration item "plugin.maxstack" changed to "50"

注册检测程序到对应检测点

检测函数接受两个参数

  • params 对应检测点的参数信息
  • context 请求上下文信息
    1. plugin.register('sql', function(params, context) {
    2. // 在这里实现检测逻辑
    3. // 并返回结果
    4. return {
    5. action: 'ignore',
    6. message: '无风险'
    7. }
    8. })

具体有哪些检测点可以注册,以及 params 的样例,请参考检 参数说明

注意: 对于同一个检测点,如果你注册了多个检测函数,这些函数会按照注册顺序,依次调用

将SQL语句解析为 Token(BETA)

函数接受两个参数

  • query 表示要解析的查询语句
  • server 表示SQL服务器类型
    目前本功能还在试验阶段,且暂时不区分SQL服务器类型
  1. RASP.sql_tokenize('SELECT * FROM users WHERE id = -1 union/*!50000select*/1,2,3', 'mysql')
  2. // ['SELECT', '*', ...]

打印调试日志

使用方法与 console.log 一致,只是会同时输出插件的名字,方便你区分不同插件的日志

  1. plugin.log('hello', 'openrasp')
  2. // 将会在日志里输出 [demo] hellp openrasp

获取插件名

  1. var name = plugin.name
  2. // => 'demo'

手动调用检测方法

在编写单元测试时,可手动调用此方法

这个方法会按照注册顺序,依次调用所有的检测函数,并返回一个检测结果数组

e.g 模拟一个SQL注入请求,请调用插件获取检测结果

  1. var params = {
  2. 'query': 'select * from users',
  3. 'server': 'mysql'
  4. }
  5. var checkContext = new Context()
  6. RASP.check('sql', params, context)
  7. // => [{
  8. // 'action': 'block',
  9. // 'message': 'attack',
  10. // 'name': 'demo'
  11. // }]

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