phpのエスケープ処理についての質問です。バージョンは5.2.8。

POSTやGETに対しては
$_POST["test"] = htmlspecialchars(stripslashes($_POST["test"]));
としています。
 
SQLiteやMySQLに対しては
sqlite_escape_string()とか、mysql_real_escape_string()、
htmlspecialchars()や、stripslashes()、
nl2br()や、mb_convert_kana()など
レコードの挿入時や抽出時に何をどのような順序で行えばよいか分からず、お手上げ状態です。
 
こうしたら良いという意見やアドバイスをお願いします。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2009/03/27 21:48:42
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:atrem No.1

回答回数4ベストアンサー獲得回数0

ポイント25pt

WEBで何かを入力させそれをDBに保存し、それを誰かが表示する。までを考えてみます。

※掲示板を考えてみるとイメージしやすいと思います。


1.投稿画面を表示→入力させる

2.投稿内容をDBに保存する

3.投稿した内容をだれかが表示する


といった流れが通常でしょうか。

この場合、2の時と3の場合にエスケープが必要です。


「2.投稿内容をDBに保存する」時は、mysql_real_escape_string()などを使用しエスケープします。

これは、SQLインジェクション対策といわれるものです。

ですが、できれば、バインド変数を使うことをお勧めします。


「3.投稿した内容をだれかが表示する」時は、必ずhtmlspecialcharsでエスケープします。

これは、クロスサイトスクリプティング対策といわれるものです。

場合によっては、2でDBに保存する前に、htmlspecialcharsしててもいいです。


↓このサイトが非常に参考になります。

@IT:クロスサイトスクリプティング対策の基本

id:yuki_28s

回答ありがとうございます。

参考にさせて頂きました。

改行や半角カナとかの情報も知りたかったです。

2009/03/26 15:12:44
id:b-wind No.2

回答回数3344ベストアンサー獲得回数440

ポイント25pt

「サニタイズ言うなキャンペーン」私の解釈

エスケープ処理をする場所の基本的な考えかたは上記サイトが分かりやすいかと思います。

考え方が理解できればそれぞれのケースでどの関数を使うべきかはおのずと見えてきます。

id:yuki_28s

回答ありがとうございます。

「層」という考えは分かりやすかったです。

概念は何となく理解できましたが、実用性が欲しかったです。

参考にさせて頂きます。

2009/03/26 15:51:23
id:fujisan1206 No.3

回答回数1ベストアンサー獲得回数0

ポイント15pt

Smartyで文字を丸める - ハウグリー みんなでつくるレシピ

Smarty

Smarty : Smarty Documentation Search

PHP側でエスケープしてからDBへ格納する方法以外に、HTMLへアサインする際にSmartyを使用してそちらでエスケープする方法がありますので参考にしてみてください。

id:yuki_28s

回答ありがとうございます。

少し複雑ですかね・・・。

どちらかと言えば、PHP側で処理する方法を探しています。

お手数おかけしました。

2009/03/26 16:10:59
id:hijk05 No.4

回答回数1307ベストアンサー獲得回数23

ポイント25pt

表示層(入力層)

プログラム層

DB層

まず、上記ですべてUTF8とかで統一されているのでしょうか?

統一されている場合とされていない場合では処理が変わります。

■改行

そのシステムのポリシーに依存します。一切変換を行わない場合があります。

■半角カナとかの情報も知りたかったです。

文字コードによります。UTF8で統一されてるのなら、意識する必要はないです。

id:yuki_28s

回答ありがとうございます。

参考にさせて頂きます。

2009/03/27 01:39:07

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません