読者です 読者をやめる 読者になる 読者になる

tohokuaikiのチラシの裏

技術的ネタとか。

Confluenceのプラグイン開発を承ります。ご連絡はこちらのホームページからお願いいたします。

PHPのmagic_quoteって、セキュリティ対策のために産まれたわけじゃないだろ?と思ってた。

F's Garage @fshin2000 :magic_quotesを有害認定したのは間違いじゃなかろうか。

magic_quoteがダメなのは、セキュリティ対策として機能が足りないのであって、magic_qouteを使うとセキュリティ意識が思考停止するからと完全否定した結果として、今の状況があるのかもしれない。

ちがうよ。単にmagic_quote=addslashesが使えない関数だからだよ。addslashesはDB用に作ったけど、そんなの各DBの仕様にあわせなきゃダメに決まってるじゃん。使える関数になるわけじゃないじゃん。まぁ、負の遺産。こんなんを自動FILTERでデフォルトONにするPHPがクソと言われれば「はいそうですね」って感じだけど。


それより、自分は

セキュリティ対策として機能が足りないのであって

「えぇー!?PHPのmagic_quoteってセキュリティ対策のために作られたの?」と、度肝を抜かれた。
こういうときはマニュアルを読もう。
PHP: なぜマジッククオートを使用していたのか - Manual

マジッククオートは、初心者により書かれたコードを危険から 守る手助けとなります。 マジッククオートをonにした場合でも SQLインジェクション は可能ですが、そのリスクは減少します。


うぁあああぁあぁあぁ


こりゃダメだ。だが、おかしいぞ。そもそもmagic_quote = addslashesなんだけど、addslashesが何のために生まれたのかが、その鍵を握る!!
PHP: addslashes - Manual

データベースへの問い合わせなどに際してクォートされるべき文字の前に バックスラッシュを挿入した文字列を返します。 クォートされるべき文字とは、シングルクォート('), ダブルクォート("),バックスラッシュ (\) ,NUL (NULL バイト) です。

addslashes() の使用例は、 データベースにデータを登録するときです。例えば、 O'reilly という名前をデータベースに挿入するには、 エスケープする必要があります。ほとんどのデータベースでは O\'reilly という具合に \ を使用します。これはデータベースにデータを格納する場合のみ必要です。 追加される \ は挿入されません。 PHP のディレクティブ magic_quotes_sybase を \ にすると、' はもうひとつの ' でエスケープされます。

PHP ディレクティブ magic_quotes_gpc はデフォルトでは on で、 全ての GET、POST、COOKIE データについて基本的に addslashes() を実行します。 magic_quotes_gpc によってすでにエスケープされた文字列に対して addslashes() を実行しないでください。 さもないと、重複してエスケープされてしまいます。 関数 get_magic_quotes_gpc() はこれを確認するのに役立つかも知れません。

どこにもセキュリティのための関数なんて書いてない。おいら、addslashesって「まー、DBに登録する時にこれ掛けておけばだいたいINSERTできるよ」くらいのお手抜き便利関数かと思ってた。多分、そんな位置づけ。で、DB毎のエスケープする関数が出てくるまでのつなぎ。


おかしい。


絶対に変だ。



なんで、addslashesがセキュリティのために生まれたわけじゃないのに、magic_quoteがセキュリティ云々になっているのか。。。。




これって、どこかで誤解が生じてる。直せよだれか。つーか、どういう経緯でSecurityのところにMagic_Quoteが入ったんだろうか・・・・・。


もしかして、addslashesの昔のマニュアルには「セキュリティ対策に有効です」とか書かれてちゃったんだろうか!!


なんつーか、PHPの貶められるところってこういう誤解がまかり通ってるところとか、超絶有名なPHPerであるPHPSPOTのBlogが悶絶だったりするところに起因してるんじゃないだろうか。えー?!?!?でもさー、ユーザー多いから、たとえ正しい方向でも仕様変わると影響大きいからPHP-Devも動きにくいんじゃね?とかフォローしてみる。