データ ベースと連動したSQL文生成(安全なSQLの呼び出し方)

注意!この記事は「安全な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とかの人は具体的な例が載ってない。
詳しくは別の参考書なりで学ばないといけない。

参考

安全なSQLの呼び出し方

コメント

タイトルとURLをコピーしました