• Writing Secure X++ Code(二)


    几个危险的API,及其应对方式和最新的BP提示.
    1.Direct SQL
    通过Connection和Statement类执行SQL语句,会有遭受SQL注入攻击的危险.用来封装该功能的核心类SysSQLBuilder 也有同样的危险.记住Record-Level和Filed-Level的安全机制,不会在Statement上强制执行.如下语句就有SQL注入危险.
    void MyFunction str _value)
    {
        DictTable  dictTable  
    = new DictTable(tableNum(custTable));
        Connection connection 
    = new Connection();
        Statement  statement  
    = connection.createStatement();
        str sql 
    = strfmt("SELECT * FROM %1 WHERE %2 == %3",
                  dictTable.name(DbBackend::Sql), 
                  fieldStr(Custtable, accountNum), 
                  _value);
        ;
        statement.executeUpdate(sql);
    }

    应对:
    A.使用相对安全的方式执行SQL语句:用Query类,View或者X++语句.
    B.真正的解决之道是采用参数化查询(这个在Axapta怎么实现还真没找到办法).
    C.不要在X++ select语句中使用forceLiterals 保留字
    D.不要执行Query.literals(true).
    E.避免接受用户可以直接控制的输入.
    F.确保没有向用户暴露未经过显示安全验证的数据.
    BP
    在调用如下函数的时候,如果传入的参数既不是text常量也不是宏的时候将会有BP错误报出.
    Statement.executeQuery(parameter)
    Statement.executeUpdate(parameter)
    2.运行时编译和执行X++代码.
    如下API允许执行包含X++语句的字符串变量.
     RunBuf
     EvalBuf
     XppCompiler
    如果入侵者可以控制这些API的输入,整个系统的安全性将受到威胁.利用代码注入攻击,攻击者可以拥有client,server和database server的控制权.
    确保输入参数不包含未经确认的数据.
    应对:
    1.要求开发者的权限.
    在用户可以输入X++代码的控件和数据类型上进行开发者权限验证.设置securitykey的值属性为SysDevelopment
    2.重构代码,去掉需要在运行期编译的代码
    比如如下代码:
    buf  = @'
    void go(%1 _var)
    {
    ;
        _var.
    %2();
    }

    ';
    buf = strfmt(buf, classId2Name(classidget(this)), methodName);
    if (compiler.compile(buf))
    {
        runbuf(buf, 
    this);
    }

    可以用
    SysDictClass::invokeObjectMethod(this, methodName);
    代替.
    BP
    当调用如下方法时会出现BP错误
     Runbuf(parameter)
     Evalbuf(parameter)
     XppCompiler.execute()
     XppCompiler.executeEx()
    后面的几个就不再Mark了.


  • 相关阅读:
    U启动安装原版Win7系统教程
    U启动制作U盘启动盘详细教程
    大白菜装机版一键制作启动u盘教程
    git 学习笔记5--rm & mv,undo
    git 学习笔记4--.gitignore
    git 学习笔记3--status flow
    git 学习笔记2--How to create/clone a repository
    git 学习笔记1--config & help
    Ubuntu Mono 运行 Helloworld
    HttpClient 使用
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/472621.html
Copyright © 2020-2023  润新知