パラメータ化されたクエリを使用します。連結を使用して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文字列の作成方法によっては、これを行う方法は他にもたくさんあります。それらのケースを保護するだけで安全を感じたいのであれば、それはあなた次第です。私はしません。型安全性を使用してすべてのクエリを適切にパラメータ化します。すべての問題を排除し、初期費用が高額になる可能性がある場合でも、夜はよく眠れます。