代码之家  ›  专栏  ›  技术社区  ›  holz

对IAxaptaRecord.Executestmt()的注入安全调用

  •  3
  • holz  · 技术社区  · 15 年前

    有通过Axpata Business Connector调用的注入安全方法吗

    string salesId = someObject.Text;
    
    IAxaptaRecord salesLine = ax.CreateRecord("SalesLine");
    salesLine.ExecuteStmt("select * from %1 where %1.SalesId == '" + salesId + "'"); 
    

    如果someobject.text设置为以下值,那么我就容易受到X++代码注入的攻击:

    "SomeSalesOrder' || %1.SalesId == 'SomeOtherOrder"
    

    有没有一种方法可以参数化查询,或者最好直接用X++编写所有数据访问代码,然后从COM调用它?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Jan B. Kjeldsen    15 年前

    没有办法确定你已经覆盖了所有的案件…

    使用executestmt很可能是错误的方法。您应该在Axapta方法(带参数)中编写select或其他内容,然后调用该方法。

        2
  •  -2
  •   Luke Schafer    15 年前

    您应该在“to”上进行替换 例如

    string salesId = someObject.Text.Replace("'", "\\'");
    
        3
  •  -2
  •   Velislav Marinov    15 年前

    霍尔茨

    可以将参数化的select语句与forceplaceholder关键字一起使用。 这是x++中的默认行为,但由于可以为复杂联接重写此行为,因此最好隐式指定forceplaceholder提示。

    由于参数化选择会增加一些额外的开销,并且不允许对参数的实际值进行优化,因此您可能需要考虑使用视图或Axapta查询。

    当做, 马里诺夫