[解決済み] なぜSQL文では常にパラメータを使用するのが好ましいのか?
疑問点
私はデータベースを扱うのにとても慣れていません。今私は書くことができます
SELECT
,
UPDATE
,
DELETE
そして
INSERT
コマンドを使用します。しかし、私は、私たちが書くことを好む多くのフォーラムを見たことがあります。
SELECT empSalary from employee where salary = @salary
...の代わりに
SELECT empSalary from employee where salary = txtSalary.Text
なぜいつもパラメータを使うのがいいのか、そしてどのように使えばいいのか。
最初の方法の使い方とメリットを知りたかったからです。SQLインジェクションという言葉も聞いたことがありますが、完全に理解しているわけではありません。SQLインジェクションが私の質問と関係があるのかどうかもわかりません。
どのように解決するのですか?
パラメータを使用することで SQLインジェクション攻撃 を防ぐことができます。
この例では、ユーザーがデータベース上で直接 SQL コードを実行することができます。
txtSalary
.
例えば、次のように書くとします。
0 OR 1=1
と書いた場合、実行されるSQLは次のようになります。
SELECT empSalary from employee where salary = 0 or 1=1
これにより、すべてのempSalariesが返されることになります。
さらに、ユーザはあなたのデータベースに対して、削除を含む、より悪いコマンドを実行することができます。
0; Drop Table employee
:
SELECT empSalary from employee where salary = 0; Drop Table employee
テーブル
employee
は削除されるでしょう。
あなたの場合、.NETを使用しているようですね。パラメータを使用するのは、次のように簡単です。
string sql = "SELECT empSalary from employee where salary = @salary";
using (SqlConnection connection = new SqlConnection(/* connection info */))
using (SqlCommand command = new SqlCommand(sql, connection))
{
var salaryParam = new SqlParameter("salary", SqlDbType.Money);
salaryParam.Value = txtMoney.Text;
command.Parameters.Add(salaryParam);
var results = command.ExecuteReader();
}
Dim sql As String = "SELECT empSalary from employee where salary = @salary"
Using connection As New SqlConnection("connectionString")
Using command As New SqlCommand(sql, connection)
Dim salaryParam = New SqlParameter("salary", SqlDbType.Money)
salaryParam.Value = txtMoney.Text
command.Parameters.Add(salaryParam)
Dim results = command.ExecuteReader()
End Using
End Using
2016-4-25を編集します。
George Stockerさんのコメント通り、サンプルコードで
AddWithValue
. また、一般的には
IDisposable
の中に
using
ステートメントを使用します。
関連
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQL ServerでJOINを使用してテーブルを更新しますか?
-
[解決済み] T-SQLを使用して外部キー制約を一時的に無効にするにはどうすればよいですか?
-
[解決済み] SQLの複数列の順序付け
-
[解決済み] PDOのプリペアドステートメントは、SQLインジェクションを防ぐのに十分ですか?
-
[解決済み] SQL ServerにおけるINSERT OR UPDATEに関する解決策
-
[解決済み] 項目xにアクセスできるように文字列を分割するにはどうすればよいですか?
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
-
[解決済み】結合を使用したSQL更新クエリ
-
[解決済み] どちらが速いか/ベストか?SELECT * または SELECT column1, colum2, column3, etc.
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SQLサーバーでNULL = NULLがfalseに評価される理由
-
[解決済み] アドホッククエリとは何ですか?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] SQL Server の VARCHAR/NVARCHAR 文字列に改行を挿入する方法
-
[解決済み] SQL Server の CASE ステートメントで OR がサポートされていない。
-
[解決済み] DISTINCTでCOUNT(*)を選択する
-
[解決済み] SQL ServerでGROUP BYを使って文字列を連結する方法とは?
-
[解決済み] Entity Framework VS LINQ to SQL VS ADO.NETでストアドプロシージャを使う?[クローズド]