0

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

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

这是一个非常糟糕的主意,我什至讨厌自己写那个……但我不确定如何最好地对其进行消毒。通常参数化是通过 sql 驱动程序 (AFAIK) 完成的,我唯一能想到的……是我可以从DBD::ODBC获取最终的 SQL 字符串吗?欢迎提出其他建议。也许有一个我可以使用的消毒库?

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

4

3 回答 3

2

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

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

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

于 2013-09-26T09:20:49.243 回答
0

我发现这个文档表明有一个 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 接口文档中根本没有提到这一点。

于 2013-10-09T18:13:03.477 回答
-1

也许您有一个名为 ManufactuerGUID 的表,并且您可以轻松地将 CRUDS 编码到该表中……除此之外,您正在询问使糟糕情况变得更好的最佳方法……如何将 SqlParameters 用于您的输出并且解析仍然会拒绝坏事。

于 2013-09-26T04:17:17.420 回答