「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」をしとくべきなのでしょうか?
※なんでもかんでもやればいいってものでもないのかな? と思い、質問しました。
No.2ベストアンサー
- 回答日時:
>> ■質問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 インジェクションは決して発生しません (しかし、もし信頼できない入力をもとにクエリの他の部分を構築している のならば、その部分に対するリスクを負うことになります)。 」
>htmlspecialchars の 第三引数 $charset のデフォルトは ISO-8859-1 で固定なため、省略した場合ほとんど使い物にならない。
今まで、何となく第三引数を設定していたのですが、デフォルトが ISO-8859-1 で固定とは知りませんでした。勉強になりましたー。
また、質問2、質問3で、教えていただいたURLが、自分が知りたい内容ズバリのページだったため、大変参考になりました。
ありがとうございました。
No.3
- 回答日時:
JavaScript に埋め込む場合は、PHP 5.2.0 以降なら、json_encode が追加されている。
それ以前なら自前で用意するしかない。No.1
- 回答日時:
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 でお茶を濁すこともあるけど、それと知って使うようにしたい。
参照先はあまり参考になるとは思えません。オリジナルリソースを読むなり、もう少しましな参考サイト、書籍を探してみてください。
># htmlspecialchars には ENT_QUOTES をした後 addslashes しておく必要があるなんて話は出てこない。
ありがとうございます。これだけ、はっきり書いていただくと、分かりやすくて助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 宅地建物取引主任者(宅建) 宅建の質問です 下の問題の答えがバツです 別段の定めがある場合を除いてと書いてあるので、処分できない 2 2023/08/04 21:43
- 情報処理技術者・Microsoft認定資格 応用情報処理技術者試験のシステム利用率の計算について 2 2022/03/28 07:43
- 物理学 物理(車関係)について教えて下さい。 2 2022/08/12 16:43
- 知的財産権 ピクサベイの著作権フリー写真の規約について。このような写真の使い方はOKでしょうか? 2 2022/10/28 11:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPのサンプルコードが意図した...
-
接続ができません
-
旧filemakerで和暦(令和など)...
-
root@localhostを消してしまった
-
文字化けが解消できません…MySQ...
-
phpMyAdmin最新版で文字化け
-
MYSQLへODBC接続すると文字化け...
-
Column '' not found.
-
view と トリガを抽出する方法...
-
DBから取得した値を加工して別...
-
aes_decryptでsyntax error
-
mysqlのインストール時に設定ウ...
-
xamppでMySqlが正しく起動しない
-
CSVをMYSQLにインポートすると...
-
SQLのVARCHARとVARCHAR2の違い
-
php $dsn
-
MySQLでのデータ保存場所の変更
-
MySQLのテーブルのデータ数のカ...
-
mysql sqlエラー
-
cseの使い方について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クラスファイルでエラーが出て...
-
mysql_queryでのdelimiterの設...
-
mySQLのインストール関連
-
cronを使ってPHPからMysqlが実...
-
接続ができません
-
SQLのVARCHARとVARCHAR2の違い
-
副問合せにLIKE文を使う方法は...
-
ODP.NETのバージョン確認
-
ERROR 1045 (28000) (using pas...
-
like句を使って日本語を検索す...
-
VBAで変数内に保持された二次配...
-
MySQLカラム名は日本語と英数字...
-
INT型は金額の型に使用するべき...
-
プライマリーキーの昇順でソー...
-
Float型の時の計算結果がおかしい
-
RPMのmysqlとmysql-serverの違い
-
ヌル値は記憶容量を必要としな...
-
テーブル作成でエラーが出てき...
-
ADOのバージョンを確認する方法
-
my.cnf と my.ini の違い
おすすめ情報