当通过XML传输sql时,防止sql注入

时间:2013-09-26 03:50:13

标签: sql-server perl sql-injection aspdotnetstorefront

This Raw SQL WSI API看起来非常强大,但它似乎也是完成检索我需要的实体的id的唯一方法。我需要能够,例如通过名称检索制造商(辩论是否有更好的方法)。假设最好的方法是发送像这样的查询

'SELECT ManufactuerGUID FROM Manufacturer WHERE Name = ' . "$name"

这是一个非常糟糕的主意,我甚至讨厌写这个......但我不确定如何最好地消毒它。通常参数化是通过sql驱动程序(AFAIK)完成的,我能想到的唯一一件事就是......我是否可以从DBD::ODBC获取最终的SQL字符串?欢迎其他建议。也许我可以使用一个消毒库?

为了澄清,我对ASP.net Storefront的API没有实际控制权。制造商Name是唯一来自人工输入的参数,因此我不必担心如何对其余部分进行编码。是的,这个API是一个非常愚蠢的想法,如果他们给了我一个参数化查询的方法,那就太棒了。

3 个答案:

答案 0 :(得分:2)

DBI提供了quote方法。最好将此方法与目标数据库实际连接使用,但如果不能这样做,您也可以使用NullP驱动程序。

use DBI;
my $dbh = DBI->connect("dbi:NullP:");
my $quoted_name = $dbh->quote($name);

请注意quote的结果已经包含单引号或双引号,因此您不必自己编写它们。

答案 1 :(得分:0)

我发现this documentation表明存在QueryParams选项。

<query name="Entities" rowElementName="Entity"> 
<sql> 
 <![CDATA[ 
  select Name,Description from {EntityName} with (NOLOCK) where {EntityName}ID=@EntityID 
]]> 
</sql> 
<querystringreplace replaceTag="{EntityName}" 
    replacetype="runtime" 
    replaceparamname="EntityName" 
    defvalue="" 
    validationpattern="(category)|(section)|(affiliate)|(manufacturer)|(distributor)|(library)" /> 
<queryparam paramname="@EntityID" 
    paramtype="runtime" 
    requestparamname="EntityID" 
    sqlDataType="int" 
    defvalue="0" 
    validationpattern="" /> 
</query> 

我相信这足以阻止sql注入(尽管知道产品确认的人会很高兴)。为什么在主要的SQL接口文档中根本没有提到这一点我永远不会理解。

答案 2 :(得分:-1)

也许你有一个名为ManufactuerGUID的表,你可以很容易地将CRUDS编码到那个......除此之外,你要求最好的方法来改善一个糟糕的情况......如何使用SqlParameters为你的输出和解析仍然会拒绝坏事。