5

私は何かについて非常に混乱していて、誰かが説明できるかどうか疑問に思っていました.

PHP では、ユーザー入力を検証するので、htmlentitiies、mysql_real_escape_string をデータベースに挿入する前に使用します。明らかに、データがデータベースに入るときに mysql_real_escape_string を使用しますが、データベースからデータを取得して Web ページに表示するときにのみ htmlentities() を使用する必要があるかどうかはわかりません。元の形式を保持していないため、後でそのデータを別の目的で使用する場合に問題が発生する可能性があります。

たとえば、名前、件名、メッセージの 3 つのフィールドを持つゲストブックがあります。明らかに、フィールドには js タグ内の悪意のあるコードのようなものを含むことができます。データベース内の役に立たないデータ。悪意のあるコードを Web ページ (ゲストブック) に出力するときに htmlentities を使用することで、htmlentities はそれを安全な同等のものに変換したため問題ありませんが、同時に、データベースには不要な悪意のあるコードが含まれています。

したがって、これをすべて言った後、私の質問は、データベース内の一部のデータが悪意のある、役に立たないデータである可能性があるという事実を受け入れる必要があり、出力で htmlentities を使用している限り、すべてが問題ないか、それとも何か他のことを行う必要があるかということです。

受信時にデータをフィルタリングし、出力時にエスケープして元のフォームが保持されるようにすることについて多くの本を読みましたが、すでにphpなどに組み込まれている関数を使用してフィールドがintのみであることを保証するなどの例しか示していませんが、見つけたことはありませんユーザーが好きなものを入力できるようにするゲストブックのようなものを確保することに関して何か、また mysql_real_escape_string() とは別にそのようなデータをフィルタリングしてDBクエリを壊さないようにする方法については?

誰かが私のためにこの混乱を最終的に閉じて、私が何をすべきか、そしてベストプラクティスは何ですか?

説明できる人に感謝します。

乾杯!

4

3 に答える 3

2

これは長い質問ですが、あなたが実際に求めていることは、要約すると次のようになると思います。

「HTML をデータベースに挿入する前、または表示するときに HTML をエスケープする必要がありますか?」

この質問に対する一般的に受け入れられている答えは、HTML をデータベースに入れる前ではなくhtmlspecialchars、ユーザーに表示するときに ( 経由で) HTML をエスケープする必要があるというものです。

その理由は次のとおりです。データベースにはデータが格納されます。あなたが入れているのは、ユーザーが入力したものです。を呼び出しmysql_real_escape_stringても、データベースに挿入される内容は変更されません。ユーザーの入力を SQL ステートメントとして解釈することを回避するだけです。 htmlspecialcharsHTML に対しても同じことを行います。ユーザーの入力を印刷すると、HTML として解釈されることを回避できます。インサートの前に電話した場合htmlspecialchars、あなたはもはや忠実ではありません.

可能な限り忠実度の高い表現を得るために常に努力する必要があります。「悪意のある」コードをデータベースに保存しても害はありません (実際、エスケープされた HTML はエスケープされていない HTML よりも長いため、スペースを節約できます!)、将来そのHTML が必要になる可能性があります (XML パーサーを使用するとどうなるでしょうか)。いつの日か、信頼できるユーザーがコメントに HTML のサブセットを含めることを許可するか、またはそのようなものを許可しますか?)、許可しないのはなぜですか?

また、他のタイプの入力検証 (整数制約など) についても少し質問します。データベーススキーマはこれらを強制する必要があり、アプリケーションレイヤーでもチェックできます(できればJSを介した入力で、次にサーバー側で)。

mysql_real_escape_string別の注意点として、PHP でデータベース エスケープを行う最善の方法は、直接呼び出すのではなく、おそらく PDO を使用することです。PDO には、型チェックなど、より高度な機能があります。

于 2010-09-03T18:39:31.240 に答える
1

mysql_real_escape_string()データベース操作に必要なのはこれだけです。悪意のあるユーザーが、クエリを「壊す」ようなデータを埋め込むことができないようにします。

htmlentities()htmlspecialchars()クライアント/ブラウザに送信する作業をしているときに活躍します。敵対的な可能性のある HTML をクリーンアップしたい場合は、HTMLPurifierを使用することをお勧めします。これにより、データが岩盤に取り除かれ、ブリーチでホースダウンされ、適切に再構築されます。

于 2010-09-03T18:36:50.450 に答える
0

HTML が出てきたときにエスケープしているのであれば、悪意のある JavaScript コードがデータベースにあることを心配する必要はありません。DB から出てくるものはすべて必ずエスケープするようにしてください。

于 2010-09-03T18:41:04.050 に答える