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

PHP用語集

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


対策


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


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


・prepared statement

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

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

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

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


プレースホルダ


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

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

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

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

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

週間人気ページランキング / 8-6 → 8-12
順位 ページタイトル抜粋 アクセス数
1 定数 4
1 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 4
2 PHP用語 3
2 「POSIX正規表現」と「PCRE正規表現」の違い 3
2 結合時の評価と優先順位 | 演算子 3
2 PHPで定数を定義する方法は2種類ある / 配列定数の定義 3
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 3
3 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 2
3 コード例 … 「例外処理」はネストすることができる 2
3 ブラウザを閉じたらセッションデータはどうなるの? | セッション 2
3 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 2
3 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 2
3 curl で Cookie を使用する 2
3 ( ! ) Warning: Declaration of xxxx should be compatible with | エラーメッセージ 2
3 http_build_query | URLs(関数) 2
3 and | 演算子 2
3 Cookie | クッキー 2
4 Warning: PDO::query(): LOAD DATA LOCAL INFILE forbidden | Warning(エラーメッセージ) 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 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined | Fatal error(エラーメッセージ) 1
2025/8/13 1:01 更新
指定期間人気ページランキング / 2020-5-28 → 2025-8-12
順位 ページタイトル抜粋 アクセス数
1 PHP用語 6696
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 2506
3 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 2452
4 ブラウザを閉じたらセッションデータはどうなるの? | セッション 1669
5 【テスト投稿】テスト | 1133
6 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 1060
7 PHPで定数を定義する方法は2種類ある / 配列定数の定義 989
8 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 884
9 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 845
10 コード例 … 「例外処理」はネストすることができる 839
11 curl で Cookie を使用する 836
12 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 833
13 Fatal error: Uncaught RuntimeException: SplFileObject::__construct(): failed to open stream: Permission denied in | Fatal error(エラーメッセージ) 730
14 定数 723
15 インターフェイス | クラスとオブジェクト 694
16 Fatal error: Uncaught HeadlessChromium\Exception\OperationTimedOut: Operation timed out (3sec) in | Fatal error(エラーメッセージ) 683
17 メンバー | クラスとオブジェクト 645
18 Warning: include() [function.include]: Failed opening '**.php' for inclusion (in | Warning(エラーメッセージ) 631
19 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column | Fatal error(エラーメッセージ) 600
20 Warning: strlen() expects parameter 1 to be string, array given in ○○.php on line △△ | Warning(エラーメッセージ) 580
2025/8/13 1:01 更新