0

アプリケーションの 1 つに対して Dynamic SQl でコーディングされた Proc があります。姓で応募者を検索するために使用しています。現在、姓の最初の 2 桁または完全な姓のいずれかで応募者を検索しています。しかし、姓にアポストロフィが含まれる応募者を検索するのに問題があります (オコナーの例)。クライアントが O' または O'Connor で応募者を検索しようとすると、エラーがスローされます。彼らは、姓にアポストロフィの有無にかかわらず、すべての応募者を検索したいと考えています。助けてください私はすべてを試しましたが、うまくいきません。以下は、応募者をプルするために Proc で使用する私の検索コードです。

必要に応じてワイルドカードを追加します

if Rtrim(@FirstName) <> ''
begin 
  If(Len(@FirstName) < 30) and (CharIndex('%', @FirstName) = 0) and @FirstName != ''
         Set @FirstName = char(39) + @FirstName + '%' + char(39)
end 

if Rtrim(@LastName) <> ''
begin 
   If(Len(@LastName) < 60) and (CharIndex('%', @LastName) = 0) and @LastName != ''
     Set @LastName = Char(39) + @LastName + '%' + char(39)
end

ここで、入力パラメーターに基づいてフィルター ベースを動的に構築します。

if Rtrim(@LastName) <> ''
 select @Where = @Where + ' and a.LastName like '+ Rtrim(@LastName)
4

2 に答える 2

3

SQL 文字列を作成するときに、入力文字列のアポストロフィをエスケープする必要があります (基本的に、1 つの ' を 2 つの '' に置き換えます)。

セキュリティ上の問題 (SQL インジェクション攻撃) としてユーザー入力を SQL サーバー データベースに渡すことを選択した場合は、どこでもこれに注意を払う必要があります。Bobby Tablesを参照してください。

if Rtrim(@LastName) <> ''
 select @Where = @Where + ' and a.LastName like '+ Replace(Rtrim(@LastName),'''','''''') + ''
于 2009-11-07T14:24:11.800 に答える
0

私の提案は、アポストロフィ/一重引用符を # などの特殊文字に置き換えて、フィルタリングに使用する代替列を含むクエリを作成することです。これにより、元の列を表示したい場合に備えて、元の列をそのままにしておくことができます。

SQL Server でこれを行うには、次のようにします。

Select
    tbl.strName_Last,
    REPLACE(tblOrder.strName_Last, '''','#')) as StrLastNameForFilter
  ....

次に、この代替列に基づいてフィルター処理するようにコードを変更し、ユーザー提供のフィルター文字列で、アポストロフィ/一重引用符を特殊文字に置き換えます。

于 2011-11-22T00:55:35.733 に答える