SQLインジェクションについて調べていたのですが、対策の一つに静的プレースホルダーを用いる方法あるかと思います。
しかし、何故静的プレースホルダーを用いることでSQLインジェクション対策になるのかが分かりません。
リンク先では、SELECT user_id,password FROM users WHERE user_id='1' or '1' = '1'
このようにSQLへ指定された場合必ずTRUEとなってしまうとあるのですが、仮に静的プレースホルダーを利用したとしても、どのみち値をバインドする為、同じなのではないかと思ってしまいます。
何故、値をプレースホルダーへバインドすることがSQLインジェクションの対策になるのでしょうか?
詳しい方が、いらっしゃいましたら教えて頂けましたら幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
仮に静的プレースホルダーを利用したとしても、どのみち値をバインドする為、同じ
いいえ、攻撃側からのパラメータ渡しで
SELECT user_id,password FROM users WHERE user_id='1' or '1' = '1'
というSQLを作成することが困難なので、セキュリティはぐっと高まります
たとえば
PHP
1$a="1' or '1' = '1"; 2$sql="SELECT user_id,password FROM users WHERE user_id='$a'"; 3print $sql; 4//SELECT user_id,password FROM users WHERE user_id='1' or '1' = '1'
これが
PHP
1$a="1' or '1' = '1"; 2$sql="SELECT user_id,password FROM users WHERE user_id=?"; 3``` 4としても実行されるのは(イメージとして) 5SELECT user_id,password FROM users WHERE user_id="1' or '1' = '1" 6なので、攻撃が無効化されています
投稿2019/09/30 11:35
編集2019/09/30 11:41総合スコア116661
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/30 12:20
2019/09/30 12:31
2019/09/30 12:37 編集
2019/09/30 12:51
2019/09/30 12:58
2019/09/30 13:18 編集
2019/10/01 00:00
0
静的プレースホルダを用いる場合、データベース・サーバー側でのSQLの処理(コンパイル等)は、プレースホルダのままで行われます。なので、ご指摘のSQL文は以下の状態のままコンパイルされます。
SQL
1SELECT user_id,password FROM users WHERE user_id=?
プレースホルダ記号のままSQL文がコンパイルされるため、この段階でSQLの意味は確定します。
そして、バインド処理はコンパイル後のSQL文に対して行われます。既にコンパイルされたSQL文に対して、値をいくら工夫しても、SQL文の意味が変わる(例えばOR演算子が増える)ことはありません。
これが静的プレースホルダが安全である理由です。
投稿2019/09/30 11:53
総合スコア11705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
仮に静的プレースホルダーを利用したとしても、どのみち値をバインドする為、同じなのではないかと思ってしまいます。
いえ、静的プレースホルダでは先に構文を組み立てるという処理が行われます。後から来た値は、値としてしか認識されません。
(元来、静的プレースホルダは「値だけ変えて同じ構造のSQL文を複数実行する場合に、事前に準備して効率化する」という狙いのものだったのですが、実行の仕組み上「値と構文が混ざらない」というメリットもあったので、セキュリティ目的でも使われています)
投稿2019/09/30 11:47
総合スコア145967
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。