SQLインジェクション対策 … プリペアドステートメント利用

PHP用語集

カテゴリー: セキュリティ  閲覧数:1125 配信日:2014-05-26 22:19


対策


SQLインジェクションの最も確実で根本的な対策
・可能な限りプリペアドステートメントを利用


プリペアドステートメントとは?


・prepared statement

狭義
・先にSQLを確定しコンパイルしてしまうこと

広義
・「値と置き換えるためのプレースホルダを含んだSQL」を事前に準備して、SQL実行時値をプレースホルダに割り当てる機能

プリペアドステートメント使用メリット
・後から変数部分に値だけを配列に束ねて実行する(バインド機構)ため、危険な文字列の挿入等によって(原理的に)SQL文の破壊が発生しない
・より安全
・SQL文を発行する際にプログラム側でエスケープを行う必要がなくなるため、エスケープ漏れによるSQLインジェクションの可能性を減らすことが可能

引用符
・プリペアドステートメントに渡すパラメータを、引用符で括る必要はない(ドライバが自動的に実施)


プレースホルダ


プレースホルダとは?
・SQLの中に予め変数が入る場所(プレース)を確保(ホールド)しておくこと
・パラメータ部分を示す記号「?」のこと
・「バインド変数」と呼ぶこともある

バインドする
・パラメータ部分を示す記号「?」へ実際の値を割り当てること

プレースホルダの種類
1.静的プレースホルダ 
2.動的プレースホルダ

1.静的プレースホルダ 
パラメータのバインド処理をデータベースエンジン側で実行する方式
・正統

2.動的プレースホルダ
・パラメータのバインド処理を、アプリケーション側のライブラリ内で実行する方式
・文字列を動的に組み立てるから脆弱性が入り込む

週間人気ページランキング / 12-25 → 12-31
順位 ページタイトル抜粋 アクセス数
1 Notice(エラーメッセージ) カテゴリー 4
2 PHPにおけるメソッドのオーバーライドについて /「引数の数や型は、親クラスのメソッドと完全に一致していなければなりません。」とは具体的にどういう意味ですか? 3
2 PHPで定数を定義する方法は2種類ある / 配列定数の定義 3
2 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 3
3 「POSIX正規表現」と「PCRE正規表現」の違い 2
3 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined | Fatal error(エラーメッセージ) 2
3 Mailer Error: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting | エラーメッセージ 2
3 http_build_query | URLs(関数) 2
3 or(||) | 演算子 2
3 No route found fo | エラーメッセージ 2
3 and | 演算子 2
4 Fatal error: Uncaught RuntimeException: SplFileObject::__construct(): failed to open stream: Permission denied in | Fatal error(エラーメッセージ) 1
4 curl で Cookie を使用する 1
4 文字列型(string) | 型 1
4 You currently have Essential access which includes access to Twitter API v2 endpoints only. If you need access to this endpoint, you’ll need to apply for Elevated access via the Developer Portal. | Twitter API(エラーメッセージ) 1
4 Catchable fatal error: Object of class DateTime could not be converted to string | Fatal error(エラーメッセージ) 1
4 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 1
4 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 1
4 Warning: strlen() expects parameter 1 to be string, array given in ○○.php on line △△ | Warning(エラーメッセージ) 1
4 ob紛らわしい関数()一覧 | 出力バッファリング制御(関数) 1
2026/1/1 1:01 更新
指定期間人気ページランキング / 2020-5-28 → 2025-12-31
順位 ページタイトル抜粋 アクセス数
1 PHP用語 6721
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 2556
3 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 2514
4 ブラウザを閉じたらセッションデータはどうなるの? | セッション 1710
5 【テスト投稿】テスト | 1133
6 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 1089
7 PHPで定数を定義する方法は2種類ある / 配列定数の定義 1064
8 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 910
9 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 880
10 コード例 … 「例外処理」はネストすることができる 869
11 curl で Cookie を使用する 863
12 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 862
13 Fatal error: Uncaught RuntimeException: SplFileObject::__construct(): failed to open stream: Permission denied in | Fatal error(エラーメッセージ) 750
14 定数 739
15 インターフェイス | クラスとオブジェクト 700
16 Fatal error: Uncaught HeadlessChromium\Exception\OperationTimedOut: Operation timed out (3sec) in | Fatal error(エラーメッセージ) 697
17 メンバー | クラスとオブジェクト 648
18 Warning: include() [function.include]: Failed opening '**.php' for inclusion (in | Warning(エラーメッセージ) 642
19 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column | Fatal error(エラーメッセージ) 611
20 Warning: strlen() expects parameter 1 to be string, array given in ○○.php on line △△ | Warning(エラーメッセージ) 609
2026/1/1 1:01 更新