注意!この記事は「安全なSQLの呼び出し方」を読んで、自分なりに解釈したものになる。
セキュリティについて勉強したい人は「安全なSQLの呼び出し方」を読むほうがいいよ。
前回SQLの呼び出し方(安全なSQLの呼び出し方)で、呼び出し方の優先順位について学んだ。
今回は、「文字列連結による組み立て」と「動的プレースホルダ」について、安全なSQL呼び出しのためには何が必要かを検討する、とのこと。
1.文字列連結にquoteメソッドを使う
文字列連結における安全な SQLの呼び出しは、以下の要件を満たさなければならない。
・ 文字列リテラルに対しては、エスケープすべき文字をエスケープすること
・ 数値 リテラルに対しては、数値以外の文字を混入させないこと
しかし、文字列リテラル生成時にエスケープが必要な文字は、データベースエンジンの種類によって異なり、さらにデータベースの設定によって異なる場合があるらしい・・・
MySQLを例にすると、シングルクォートのほかにバックスラッシュもエスケープしないとならない(エスケープ文字であるため)。
ただし、NO_BACKSLASH_ESCAPESを設定ファイルに記述すると、バックスラッシュをメタ文字として扱わなくなる。
おいおいメンドクサイナーと思っていたら以下の記述。
PerlのDBI、PHPのPear::MDB2、PDO (PHP Data Objects) などで用意されているquoteメソッドは、SQLのリテラルを生成する処理を抽象化したメソッドであり、アプリケーション開発者がデータベースエンジンの種類や設定を意識することなく、正しいエスケープ処理を実現するのに利用できます。
PHPではPear::MDB2とPDOが、簡単にエスケープしてくれるのね。
「安全なSQLの呼び出し方」ではPear::MDB2のサンプルが載ってた。
2.データベースと連動した動的プレースホルダ
動的プレースホルダとは、文字列連結をアプリケーション側で行なうが、ライブラリやドライバ側で機械的に行なう方法だった。
「安全なSQLの呼び出し方」のこの章では Perlのサンプルで、動的プレースホルダの説明されている。
・・・本来ならその記事を書くところだけど、PHPのプレースホルダすらわかってないので省略。
次回、PHPのプレースホルダ、PDOについて学ぶ。
また、「安全なSQLの呼び出し方」は今回でおしまい。
「データ ベースと連動したSQL文生成」の後に「DBMS製品の実態調査」と「まとめ」という章があるが、期待してたPHP+MySQLの例がなかったので。
「安全なSQLの呼び出し方」の総括として、リテラルとエスケープについて学べた。
ただ、あくまで概念的なものであって、PHP+MySQLとかの人は具体的な例が載ってない。
詳しくは別の参考書なりで学ばないといけない。
コメント