2009-02-27 3 views
7

ユーザがテキストエリアにテキストを入力します。その後、mySQLデータベースに直接挿入されます。私はそれをトリム、htmlentities、mysql_real_escape_stringを使用し、私は魔法の引用符を有効にしている。そのデータをテキストエリアに戻すときに、どのようにそれを消毒する必要がありますか?テキスト領域から受け取ったデータをテキスト領域に正しく出力するとき、データを適切にサニタイズするにはどうすればよいですか?

ありがとうございました。私はこれを行うの正しい方法であまりにも確信したことがない...

+0

魔法の引用符を無効にすることをお勧めしますが、後で問題が発生するだけです。 –

答えて

14

あなたはそれを保存するときにhtmlentitiesを使用すべきではありません。表示するときはhtmlentitiesを使用してください。経験則は、必要になるまでデータをエンコード/サニタイズすることではありません。それを保存するときにhtmlentitiesを実行すると、ユーザーが入力を編集したいときにテキストにhtml_entity_decodeを加えなければなりません。だから、あなたは何が必要なのか、それ以上のものは消毒します。それを保存するときは、SQLインジェクションのためにサニタイズする必要がありますので、mysql_real_escape_stringです。表示するときは、XSSのサニタイズが必要なので、htmlentitiesです。

Darryl Heinのコメントを見てもわかりませんが、magic_quotesを有効にしたくないのは本当ですか? They are a bad, bad, thingであり、PHP 5.3以降では廃止され、PHP 6では完全に廃止されます。

+0

それは私が取る唯一の予防策ですか? –

+0

文字列が何であれHTMLを許可していないのであれば、それだけです。 HTMLを許可したい場合、あなたは白いリストとそれ以外のものの非常に危険な道を下ります。 –

+0

ちょうど副次的なことですが、BBCode解析時にもこれは当てはまりますか? –

2

いつでも、PHPの旧バージョンを使用していない限り、htmlentities()の使用についての答えは、 mysql DBへの挿入は、の一部であるPrepared Statementsを使用することです。これにより、mysql_real_escape_string()を使用する必要がありません。

それ以外は、あなたがカバーするものがあると思います。

+1

プリペアドステートメントを使用するだけでは不十分であることに注意してください。バインドされたパラメータを使用する必要があります。 IOW: '?'を使用します。 SQL文字列でstmt-> bind_param()を使用してデータを送信する – Javier

+0

通常のワークフローでは、prepare文に達する前に無効なテキストをキャッチしませんか?その場合、mysql_real_escape_stringを使用するのは適切ではありません – AlxVallejo

関連する問題