PHPのSQLインジェクションについて

いる人の記事を見てPHPのSQLインジェクションの対策を取り組むために、「Validate」まで使われたようでした。
本当に「Validate」って何のために存在するもんか全然理解されていなかったな。


今日のプログラムにSQLインジェクションの対策法を取り組んだので、メモしておこう。
本家の記事:
http://php.liukang.com/manual/ja/security.database.sql-injection.php

MySQLならこんな関数があるが↓
http://php.liukang.com/manual/ja/function.mysql-real-escape-string.php

僕はMySQLが(主観的に)嫌がる人間で、これがいいかも↓
http://pear.php.net/manual/ja/package.database.db.db-common.escapesimple.php

なお、PHP5.Xの場合(4.X上の確認を行っていない)は、コードに
$sql = "SELECT SEQUENTIAL_ID, LOAD_FLG, FILE_NAME, FORMAT_ID, MENU, LETTER, MESSAGE, ".
" VALUE1, VALUE2, VALUE3, VALUE4, VALUE5 FROM TARIM_MENU_LIST_TBL ".
"WHERE SEQUENTIAL_ID LIKE '%".$sequential."'";

を書いて、ログを出したらこのような文字列になりました
SELECT SEQUENTIAL_ID, LOAD_FLG, FILE_NAME, FORMAT_ID, MENU, LETTER, MESSAGE, VALUE1, VALUE2, VALUE3, VALUE4, VALUE5 FROM TARIM_MENU_LIST_TBL WHERE SEQUENTIAL_ID LIKE '%200610_02\' OR \'1=1'

DB_common::escapeSimple()を適用したらこんな文字列になりました
SELECT SEQUENTIAL_ID, LOAD_FLG, FILE_NAME, FORMAT_ID, MENU, LETTER, MESSAGE, VALUE1, VALUE2, VALUE3, VALUE4, VALUE5 FROM TARIM_MENU_LIST_TBL WHERE SEQUENTIAL_ID LIKE '%200610_02\'' OR \''1=1'

とは言え、PHP5.X上にSQLインジェクションの攻撃は簡単に出来ません。プログラマは安心するために、DB_common::escapeSimple()を使えば無難でしょう。

以上!

コメント

このブログの人気の投稿

Linux(UNIX)、MS-DOS、OpenVMS コマンド対応表

ECスペシャリストに生まれ変われ!