3

応募者のリストを姓で返す proc を作成しました。アポストロフィを含む姓の応募者を検索する際に問題があります (O'Connor の例)。これらの応募者を見つけるのを手伝っていただけませんか:

以下は私の検索コードです:

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 

#At the end  - --Now build dinamically the filter base on input parameters
if Rtrim(@FirstName) <> ''
    select @Where = @Where + ' and a.FirstName like '+ Rtrim(@FirstName) 

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

3 に答える 3

2

アポストロフィは、二重アポストロフィを使用して T-SQL 文字列内でエスケープされます。

SELECT * FROM sometable where LastName LIKE '%''%'

アポストロフィを含む可能性のある文字列から動的 SQL ステートメントを組み立てる組み合わせは、 SQL インジェクション攻撃のリスクがあるため、非常に危険であることに注意してください。通常のユーザーは O'Connor のような名前を持っているかもしれませんが、知識のある攻撃者は、データを消去できるような「名前」を選択する可能性があります。"O'; TRUNCATE TABLE Customers; --"

少なくとも、文字列から SQL ステートメントを動的に組み立てる場合は、REPLACE (@LastName, '''', '''''')その文字列を SQL に挿入する前に、アポストロフィを二重アポストロフィ (例: ) に置き換える必要があります。

ただし、これらの文字列がユーザーからのものである場合は、SQL およびパラメーター文字列との文字列連結によって手動で SQL クエリを組み立てる代わりに、パラメーター化されたクエリを使用することを検討する必要があります。パラメータ化とは、SQL クライアント API やサーバーがパラメータを「安全な」文字列に変換することを意味します。これは、SQL インジェクション攻撃に対する最善の防御です。詳細については、このJeff Atwood ブログ投稿をご覧ください。

于 2009-11-05T16:32:54.567 に答える
2

WHEREあなたのコードは、動的 SQL句を構築しようとしているように見えます。その場でやめて捨ててください。あなたのアプローチは危険であり、エラーが発生しやすいものです。

代わりに、これに沿って何かをしたいかもしれません:

/* declare a few test variables */
DECLARE @FirstName varchar(30)
DECLARE @LastName  varchar(60)
SET @FirstName = 'First''Name'
SET @LastName = 'Last''Name'

/* these variables are for dynamic SQL execution */
DECLARE @IntVariable int
DECLARE @SQLString nvarchar(500)
DECLARE @ParmDefinition nvarchar(500)

/* define a paramertized SQL query */
SET @SQLString =
 N'SELECT 
     UserId 
   FROM 
     UserTable
   WHERE 
     LastName LIKE ''%'' + @ln + ''%'' 
     AND FirstName LIKE ''%'' + @fn + ''%''
  '

/* define the used parameters and their types */    
SET @ParmDefinition = N'@ln varchar(30), @fn varchar(60)'

/* execute dynamic SQL, syntax- and code-injection safely */
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @ln = @LastName, @fn = @FirstName

詳細な説明とサンプルについては、 MSDN をsp_executesql必ずお読みください。

于 2009-11-05T16:58:53.260 に答える
0

何かのようなもの:

...
select @Where = @Where + ' and a.LastName like ' + Replace(Rtrim(@LastName), '''', '''''')
...

(はい、私は知っています、それらはたくさんの引用ですが、うまくいきます。)

同様の ' x '構文でさらに引用符が必要です。

select @Where = @Where + ' and a.LastName like ''' + Replace(Rtrim(@LastName), '''', '''''') + '''' 

(はい、ますます多くの引用符)

これは正しいものを生成します:

and a.LastName 'like o''conor'
于 2009-11-05T16:46:14.900 に答える