[PHP-users 4195] Re: 不正な SQL になる危険性について

Youichi Iwakiri php-users@php.gr.jp
Fri, 07 Dec 2001 12:48:07 +0900


いわきりです

#Perlの時は同件で泣かされました

Osamu Shigematsu wrote in <B83651AD.15D90%shige@ravi.ne.jp>:
 >ってな感じで、登録としているのですが、例えば、foo に ' が含まれたりすると、
 >    INSERT INTO bar(foo) VALUES(''');
 >見たいにおかしなことになりますよね?
 >このほかにも何か注意するべき特殊な文字というのはあるのでしょうか?
 >
 >NUL, " なんかは、PHP の設定によって、エスケープしてくれるように
 >記憶していますが。

php.iniで
 magic_quotes_gpc = On
が設定されていれば、(GET/POST/COOKIE)で渡ってくるものに
 ['(シングルクオート)], ["(ダブルクオート)], [\(バックスラッシュ)], [NUL]
を全てバックスラッシュでエスケープされますよ。
シングルクオートも同じ扱いです。

また、magic_quotes_gpc = Offの場合は、意図的に

 $foo = addslashes("Iwakiri's Home Page");
 /* 実際の$fooの値は $foo = "Iwakiri\'s Home Page" */ 
 $sql = "INSERT INTO bar(foo) VALUES('$foo')";

でバックスラッシュでエスケープ処理された$fooを挿入できます。

またdatabaseから値を得る場合(SELECT)は
通常はバックスラッシュでエスケープされていません。

INSERTに使う値
 $foo = addslashes("Iwakiri's Home Page");

SELECTで得た値
 $res_foo = "Iwakiri's Home Page";

エスケープ処理してINSERTした値とSELECTで取り出す結果を
等しくしたいならば
php.iniに下記の設定が必要です。

 magic_quotes_runtime = On

これが設定されているとデータベースおよびtextファイルを
含む外部ソースから データを返す全ての関数のクオートは、
バックスラッシュで エスケープされます。

 >とりあえず、' が使えないのはとっても困りますので、どのように SQL を
 >記述すればよいかなどのアドバイスをいただければ幸いです。

取りあえず私は、
 magic_quotes_gpc = Off
 magic_quotes_runtime = Off
で
 INSERT時は、addslashes()を用いてのエスケープ処理をしています。
 SELECT時は、そのまま(stripslashes()を使用せず)です。

addslashes()とstripslashes()を一対一対応させる方がソースの
可読性は高まると自分では思ってるんですけど
magic_quotes_runtime = Onにしちゃうとファイルから読みこむデータも
全部クオートされてしまうので悩ましいところです。