質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

4950閲覧

動的プレースホルダの静的プレースホルダ違いとSOLインジェクション脆弱性対策

space_sss

総合スコア81

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

3クリップ

投稿2017/01/12 20:40

編集2017/01/12 21:04

プレースホルダのことを調べていましたがその際に
バインド処理を実現するライブラリによっては,SQL構文を変化させるようなSQLインジェクションを許してしまう,脆弱な実装のものが存在する可能性を否定できない。
よって,SQLインジェクション脆弱性対策には,なるべく静的プレースホルダを使用することを推奨する。
との記載がありました。
なので静的プレースホルダを使用すると思っていたのですがなぜPHPのデフォルトは動的プレースホルダがデフォルトになっているのでしょうか?
動的プレースホルダを使いたい場合は実際にどのような注意をすればいいのでしょうか?
ご解答宜しくお願いいたします。
出典
リンク内容

maki_k👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/01/12 20:47

「との記載がありました」出典を明らかにしてください。文脈によって判断が分かれる恐れがあります。また、可能であれば、ご自身で調査した内容についても追記してください。
space_sss

2017/01/12 20:49

修正いたしました。
guest

回答4

0

ベストアンサー

なぜPHPのデフォルトは動的プレースホルダがデフォルトになっているのでしょうか?

これは、動的プレースホルダにするメリットもあるということと、歴史的な経緯によるものです。
MySQLは元々静的プレースホルダ(prepared statement)をサポートしておらず、4.1になって追加されました。そのため、デフォルトが動的プレースホルダになっているという状況があります。
また、静的プレースホルダが後から追加されたということもあり、性能や安定性が、動的プレースホルダの方が優れているので、デフォルトが動的プレースホルダになっている、という面もあると思います。

動的プレースホルダを使いたい場合は実際にどのような注意をすればいいのでしょうか?

動的プレースホルダを使っていてSQLインジェクション脆弱性が問題になるのは、以下のケースが考えられます。

  1. PHPやMySQのドライバに脆弱性がある場合
  2. PDO等の使い方に問題がある場合

実はいずれも、「文字エンコーディング」の設定や扱い方に問題がある場合というのが典型的なケースとなります。現実問題としては、文字エンコーディングとしてUTF-8を使ってる限りにおいては、問題になる可能性はかなり低いと予想されます。
また、文字エンコーディングを正しく指定することが重要です。その辺りの経緯も含めて、下記の記事を参考にしていただければと思います。

PDOにおける一応の安全宣言と残る問題点

投稿2017/01/13 09:01

編集2017/01/13 13:44
ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2017/01/13 13:03

横から失礼します。 > 性能や安定性が、静的プレースホルダの方が優れているので、デフォルトが動的プレースホルダになっている、という面もあると思います。 は、 「動的プレースホルダの方が優れているので」 の誤記でしょうか? 文脈的に、その方が自然なように感じますので。
ockeghem

2017/01/13 13:44

その通りです。ご指摘ありがとうございます。先程修正しました。
KiyoshiMotoki

2017/01/13 15:00

レスありがとうございます。 勉強させていただきました。
guest

0

PHPのデフォルトは動的プレースホルダがデフォルト

PHPのバージョンによって、デフォルトの値は異なります。

こちらの記事が役立つと思います。
PHPでデータベースに接続するときのまとめ

投稿2017/01/12 21:03

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こういった内容は基本公式見解、または権威のあるサイトを踏襲する方がよろしいと思います。
「IPAの基準を満たして作成された」と言えればリスクヘッジにもなりますし。

安全なウェブサイトの作り方
http://www.ipa.go.jp/security/vuln/websecurity.html
安全なSQLの呼び出し方
http://www.ipa.go.jp/files/000017320.pdf

投稿2017/01/13 01:14

takepieee

総合スコア686

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

静的か動的かによっていくつかの違いがあります
たとえば、bindValueの再利用

SQL

1 $sql="SELECT * FROM tbl WHERE a=:x and b=:x"; 2 $stmt = $pdo->prepare($sql); 3 $stmt->bindValue(':x',10, PDO::PARAM_INT); 4 $stmt->execute();

上記を実行した場合、動的プレースホルダとしては問題ありませんが
静的プレースホルダだとエラーになります。
さまざまな配慮があってデフォルト設定が決まっているのでしょう。

投稿2017/01/13 00:33

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問