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

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

ただいまの
回答率

90.34%

  • PHP

    21267questions

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

  • SQL

    2536questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 1,252

space_sss

score 62

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Kosuke_Shibuya

    2017/01/13 05:47

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

    キャンセル

  • space_sss

    2017/01/13 05:49

    修正いたしました。

    キャンセル

回答 4

checkベストアンサー

+5

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

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

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/13 22:03

    横から失礼します。

    > 性能や安定性が、静的プレースホルダの方が優れているので、デフォルトが動的プレースホルダになっている、という面もあると思います。

    は、
    「動的プレースホルダの方が優れているので」
    の誤記でしょうか?

    文脈的に、その方が自然なように感じますので。

    キャンセル

  • 2017/01/13 22:44

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

    キャンセル

  • 2017/01/14 00:00

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

    キャンセル

+4

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • PHP

    21267questions

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

  • SQL

    2536questions

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