0

MSSQLサーバーデータベースに接続する従来のASPページがいくつかあります。SQLインジェクションを防ぐために、すべての一重引用符を二重一重引用符に置き換えるだけです。これはここで規定されている方法のようです:http ://www.4guysfromrolla.com/webtech/061902-1.shtml

これはまだ私にとって危険だと感じています。一重引用符を他の文字でエスケープして、SQLインジェクションを開く可能性がある方法はありますか?

編集:)現在、この一重引用符を使用して一重引用符を二重に置き換える古いコードがたくさんあります。SQLインジェクションを防ぐのに十分な場合は、何も変更しません。私の本当の質問は、この方法が安全でないかどうかです。

4

1 に答える 1

8

パラメータ化されたクエリを使用します。連結を使用してSQLステートメントをまとめない場合は、一重引用符が自動的に処理されます。例:

Set objCommand = CreateObject("ADODB.Command")
With objCommand
.CommandText = "INSERT dbo.Table(Column) values (?)"
.CommandType = adCmdText
.ActiveConnection = "Connection string" or existing open connection
.Parameters.Append .CreateParameter("@p1", adVarChar, adParamInput, 50, "O'Brien")
.Execute
Set .ActiveConnection = Nothing
End With

現在依存している方法は安全ではありません。ASPページに次の動的SQLが埋め込まれているとします。

sql = "SELECT Name FROM dbo.Students WHERE Id = " & Request("StudentId") 

ここで、誰かが次のものをクエリ文字列(またはフォーム、またはあなたが持っているもの)に詰め込もうと決めたとしましょう:

1; DROP TABLE dbo.Students;

この文字列を一重引用符に置き換えると、SQLインジェクションを回避するのにどのように役立ちますか?あなたが知っている場合、あなたは潜在的に次のことをすることができます:

sql = "SELECT Name FROM dbo.Students WHERE Id = " & CLng(Request("StudentId"))

ですから、とにかくこのコードを書き直して、インジェクションを可能にしているデータ型が文字列ではない場合を見つける必要があります。

SQLインジェクションは、一重引用符を利用するだけでは定義されません。SQL文字列の作成方法によっては、これを行う方法は他にもたくさんあります。それらのケースを保護するだけで安全を感じたいのであれば、それはあなた次第です。私はしません。型安全性を使用してすべてのクエリを適切にパラメータ化します。すべての問題を排除し、初期費用が高額になる可能性がある場合でも、夜はよく眠れます。

于 2012-09-26T15:17:47.630 に答える