This Raw SQL WSI API看起来非常强大,但它似乎也是完成检索我需要的实体的id的唯一方法。我需要能够,例如通过名称检索制造商(辩论是否有更好的方法)。假设最好的方法是发送像这样的查询
'SELECT ManufactuerGUID FROM Manufacturer WHERE Name = ' . "$name"
这是一个非常糟糕的主意,我甚至讨厌写这个......但我不确定如何最好地消毒它。通常参数化是通过sql驱动程序(AFAIK)完成的,我能想到的唯一一件事就是......我是否可以从DBD::ODBC获取最终的SQL字符串?欢迎其他建议。也许我可以使用一个消毒库?
为了澄清,我对ASP.net Storefront的API没有实际控制权。制造商Name
是唯一来自人工输入的参数,因此我不必担心如何对其余部分进行编码。是的,这个API是一个非常愚蠢的想法,如果他们给了我一个参数化查询的方法,那就太棒了。
答案 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为你的输出和解析仍然会拒绝坏事。