アプリ版:「スタンプのみでお礼する」機能のリリースについて

「addslashes」と「htmlspecialchars」について、いくつか分からない点があるので、教えてください。

■質問1.
http://kezy.org/2009/10/04/php-get-post
関数化している例が掲載されているのですが、このやり方を真似してもよいものでしょうか?

http://kmaebashi.com/zakki/zakki0042.html
ここでは、それぞれの処理の直前に行うべきと書かれていて、
また別のサイトでも、用途に沿った処理方法で、と書かれているのですが、
「addslashes」と「htmlspecialchars」を一つの関数にまとめることは、次のどれに当たるでしょうか?
・別に問題ない
・奨励はしないけど、間違いではない
・止めたほうがよい
※二つを関数化すると、便利だと思うのですが、必要ないところにもサニタイズ処理等がかかるのかな、と思い、そこら辺が問題ないかよく分からなかったので、質問しました。


■質問2.MySQLを利用する場合は、「addslashes」より、「mysql_real_escape_string」を利用したほうがよいのでしょうか? 両者の違いは何でしょうか?


■質問3.プリペアド・ステートメントを使うのであれば、該当フォーム部分については、別にSQLインジェクション対策をしなくてもよいのでしょうか? あるいは、プリペアド・ステートメントを利用しても、あくまでも攻撃を受ける可能性が下がるだけ(?)なので、「addslashes」をしとくべきなのでしょうか?
※なんでもかんでもやればいいってものでもないのかな? と思い、質問しました。

A 回答 (3件)

>> ■質問1.


三択なら「・止めたほうがよい」理由は #1 に書いた。
ちなみに htmlspecialchars の 第三引数 $charset のデフォルトは ISO-8859-1 で固定なため、省略した場合ほとんど使い物にならない。

>> ■質問2.
addslashes
[ クォートされるべき文字とは、シングルクォート('), ダブルクォート("),バックスラッシュ (\) ,NUL (NULL バイト) ]

mysql_real_escape_string
[エンコードされる文字は NUL (ASCII 0), \n, \r, \, ', ", および Control-Z。その際、接続で使用している現在の文字セットが考慮されます]

http://dev.mysql.com/doc/refman/5.1/ja/string-sy …

>> ■質問3.
http://php.net/manual/ja/pdo.prepared-statements …

「プリペアドステートメントに渡すパラメータは、引用符で括る必要は ありません。それはドライバが自動的に行います。 アプリケーションで明示的にプリペアドステートメントを使用するように すれば、SQL インジェクションは決して発生しません (しかし、もし信頼できない入力をもとにクエリの他の部分を構築している のならば、その部分に対するリスクを負うことになります)。 」
    • good
    • 0
この回答へのお礼

>htmlspecialchars の 第三引数 $charset のデフォルトは ISO-8859-1 で固定なため、省略した場合ほとんど使い物にならない。
今まで、何となく第三引数を設定していたのですが、デフォルトが ISO-8859-1 で固定とは知りませんでした。勉強になりましたー。

また、質問2、質問3で、教えていただいたURLが、自分が知りたい内容ズバリのページだったため、大変参考になりました。

ありがとうございました。

お礼日時:2010/11/01 13:49

JavaScript に埋め込む場合は、PHP 5.2.0 以降なら、json_encode が追加されている。

それ以前なら自前で用意するしかない。
    • good
    • 0
この回答へのお礼

ありがとうございました。
JavaScriptに埋め込む場合は、参考にします!

お礼日時:2010/11/01 13:50

SQLインジェクション以前に HTML 文書中に > < & を埋め込んでるようなら出直して来いって話。

同様に、SQL で `message`='it's up to you.' なんて書くやつもいない。

htmlspecialchars はあくまで HTML の文法に従うために、同様に、mysql_real_escape_string は MySQL の文法に従うために[文字列に対して]用いる。

それが分かっていれば迷うことはない。それら関数の存在意義はただそれだけ。

以下余談。

上が分かっていれば
# htmlspecialchars には ENT_QUOTES をした後 addslashes しておく必要がある
なんて話は出てこない。実際始めて聞いて、読んで愕然。

もう一度言う htmlspecialchars は HTML の PCDATA に対して用いられるもので、JavaScript に対して用いられるものではない。

ENT_QUOTES での統一は、わざわざ切り替えるのが面倒だから、ということを意識して使うようにしたい。統一したところでさほど問題にならない、というだけ。

# マルチバイト文字の問題
くだらなすぎる。知らない人もいるから仕方ないけど。
そもそも、mb_ 以外はほとんど、シングルバイト関数。マルチバイトに対して用いる時点で問題が起こるのは当たり前だろう。UTF-8 でお茶を濁すこともあるけど、それと知って使うようにしたい。

参照先はあまり参考になるとは思えません。オリジナルリソースを読むなり、もう少しましな参考サイト、書籍を探してみてください。
    • good
    • 0
この回答へのお礼

># htmlspecialchars には ENT_QUOTES をした後 addslashes しておく必要があるなんて話は出てこない。
ありがとうございます。これだけ、はっきり書いていただくと、分かりやすくて助かります。

お礼日時:2010/11/01 13:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!