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 に答える