[解決済み] パラメータ化されたSQLクエリを作成するにはどうすればよいですか?なぜそうする必要があるのでしょうか?
質問
すべてのユーザー入力を検証することなく SQL インジェクション攻撃から保護するために、誰もがパラメータ化された SQL クエリを使用していると聞いています。
これはどのように行うのですか? ストアドプロシージャを使用すると、自動的にそうなるのでしょうか?
私の理解では、これはパラメータ化されていないのですね。
cmdText = String.Format("SELECT foo FROM bar WHERE baz = '{0}'", fuz)
これはパラメータ化されるのでしょうか?
cmdText = String.Format("EXEC foo_from_baz '{0}'", fuz)
それとも、SQLインジェクションから身を守るために、このようなもっと大規模なことをする必要があるのでしょうか?
With command
.Parameters.Count = 1
.Parameters.Item(0).ParameterName = "@baz"
.Parameters.Item(0).Value = fuz
End With
パラメータ化されたクエリを使用する利点は、セキュリティの考慮事項の他にありますか?
更新:この素晴らしい記事は、Grotokによって参照された質問のうちの1つにリンクされていました。 http://www.sommarskog.se/dynamic_sql.html
どのように解決するのですか?
この
EXEC
の例では
ではない
はパラメータ化されています。このような入力が損害を与えるのを防ぐために、パラメータ化されたクエリ(ある業界ではプリペアドステートメント)が必要なのです。
';DROP TABLE bar;--。
の中に入れてみてください。
fuz
変数に書いてみてください。
bar
テーブルを重視するならば、そうしないこともできます)。より微妙で有害なクエリも可能です。
Sql Serverでどのようにパラメータを行うかの例です。
Public Function GetBarFooByBaz(ByVal Baz As String) As String
Dim sql As String = "SELECT foo FROM bar WHERE baz= @Baz"
Using cn As New SqlConnection("Your connection string here"), _
cmd As New SqlCommand(sql, cn)
cmd.Parameters.Add("@Baz", SqlDbType.VarChar, 50).Value = Baz
Return cmd.ExecuteScalar().ToString()
End Using
End Function
ストアドプロシージャはSQLインジェクションの防止に役立つとされることがあります。 しかし、ほとんどの場合、クエリパラメータを使って呼び出す必要があり、そうでなければ役に立ちません。ストアドプロシージャを使用する場合 だけ を使用する場合、アプリケーションユーザーアカウントのSELECT、UPDATE、ALTER、CREATE、DELETEなど(EXEC以外のほぼすべて)のパーミッションをオフにし、その方法でいくつかの保護を得ることができます。
関連
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] SQL ServerでJOINを使用してUPDATE文を実行するにはどうすればよいですか?
-
[解決済み] SQL ServerでINSERT INTOとしてデータをエクスポートする
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[エラー処理] [MySQL] [Err] 1241 - オペランドは 1 つのカラムを含む必要があります。
-
executeQuery()ソリューションでデータ操作文を発行できない。
-
MHAクラスタエラーサマリーの構築
-
[解決済み] テーブルネーミングのジレンマ:単数形と複数形の名前【非公開
-
[解決済み] Oracleの全テーブルのリストを取得しますか?
-
[解決済み] SQL Serverでテーブルからカラム名を取得するにはどうすればよいですか?
-
[解決済み] mysqldumpで特定のテーブルをスキップする
-
[解決済み] SQL Serverには、.NETのMath.Maxのような2つの値を取るMax関数はありますか?
-
[解決済み] SQL ServerでINSERT INTOとしてデータをエクスポートする
-
[解決済み] Postgres でサブクエリを使用してテーブルの行を更新する