私TextArea
のウェブサイトには、入力をデータベースに書き込むがあります。
この入力をフィルタリングしたいのですTextArea
が、HTML タグやその他のものを削除する必要はありません。
要するに、データベースに書き込む前に入力をサネタイズして保護したいのですが、データベースからエントリを取り戻してウェブサイトに書き込むときに、エントリを無傷で変更しないでおきたいのです。
どうすればこれを達成できますか?
If you mean you simply want to make it safe to store in your database all you need to do is use the database specific escaping method, for example mysql_real_escape_string. Of course, that doesn't secure you from XSS attacks, but if you want to retrieve and display it unmodified you don't have a choice.
ウェブサイトに書き戻すときに文字ごとにデータを保持したい場合は、次のことを試してください。
$stringToSave = mysql_real_escape_string($inputString);
次に、データベースから取得するとき:
$stringToPutOnPage = htmlentities($databaseString);
html を実際に html として読みたい場合 (XSS に注意してください)、以下を使用できます。
$stringToSave = mysql_real_escape_string($inputString);
編集: html の文字列をデータベースから取得する前ではなく、取得した後にサニタイズすることをお勧めします。コメントありがとうございます。方法を変更する必要があります。
それは本当に簡単です:
mysql_real_escape_string
するには、SQL クエリに連結する前に値を使用するか、そもそも不正な文字列の影響を受けないパラメーター化されたクエリを使用します。本当に、どれも同じ問題です。非常に単純な例として、文字列を生成するために"test"
(引用符を文字列の一部にしたい)、文字列literal を書くことはできません$foo = ""test""
。どの引用符が文字列を終了するはずで、どれが文字列の一部であるかを明確にするために、引用符内の引用符をエスケープする必要があります: $foo = "\"test\""
.
SQL インジェクション、XSS の問題、およびめちゃくちゃな HTML はすべて、これのバリエーションにすぎません。
引用符を含む値をクエリに挿入するには、上記と同じ問題があります。
$comment = "\"foo\""; // comment is "foo", including quotes
$query = 'INSERT INTO `db` (`comment`) VALUES ("' . $comment . '")';
// INSERT INTO `db` (`comment`) VALUES (""foo"")
これにより、せいぜい無効な構文が生成され、最悪の場合、SQL インジェクション攻撃が生成されます。を使用すると、これをmysql_real_escape_string
回避できます。
$query = 'INSERT INTO `db` (`comment`) VALUES ("' . mysql_real_escape_string($comment) . '")';
// INSERT INTO `db` (`comment`) VALUES ("\"foo\"")
HTML エスケープはまったく同じですが、構文の問題が異なります。
適切な方法を使用して、適切なコンテキストで値をエスケープするだけです。HTML の値をエスケープするには、 を使用しますhtmlentities
。必要なときにそれを行います。値を時期尚早または過剰にエスケープしないでください。適切なコンテキストで適切なタイミングで適切なエスケープ関数のみを適用してください。