phpでユーザー入力データを操作します。何がいいですか?
-
10-07-2019 - |
質問
私は、ユーザーが挿入する可能性のある望ましくないタグに関してユーザーが入力するデータを管理する最良の方法を見つけようとしています:
- strip_tags()-タグは削除され、データベースに挿入されません
- タグはデータベースに挿入されますが、そのフィールドを読み取ってユーザーに表示するときは、 htmlspecialchars() を使用します
何が良いのか、これらのいずれかに欠点はありますか?
よろしく
解決
これは、優先順位によって異なります:
- ユーザー入力から特殊文字を表示することが重要な場合(たとえばStackOverflowなど)、この情報をデータベースに保存し、ディスプレイ上でサニタイズする必要があります-この場合は、少なくとも
htmlspecialchars()
を使用して出力を表示します(より洗練されたものでない場合) - テキスト形式のコメントだけが必要な場合は、データベースに貼り付ける前に
strip_tags()
を使用します。これにより、保存する必要があるデータ量を減らし、処理時間を短縮できます。画面にデータを表示するとき
他のヒント
タグはデータベースに挿入されますが、そのフィールドを読み取ってユーザーに表示するときは、htmlspecialchars()を使用します
これ。通常、人々に小なり記号とアンパサンドを入力させ、ページ上にそのように表示させたいと思うでしょう。すべてのテキストからHTMLへの出力ステップでの htmlspecialchars
(テキストがユーザー入力、データベース、または他のどこから直接来たか)は、これを達成する正しい方法です。入力をいじるのは、出力エンコードの問題に対処するための適切な戦術です。
もちろん、 SQL 文字列にテキストを入力するためには、異なるエスケープ—またはパラメーター化-が必要になります。
ユーザー入力を保護するために講じられる対策は、データが使用されているコンテキストに完全に依存します。例えば:
- SQLデータベースに挿入する場合は、パラメーター化されたステートメントを使用する必要があります。 PHPの
mysql_real_escape_string()
もうまく機能します。 - HTMLページに表示する場合は、HTMLタグを削除またはエスケープする必要があります。
- 一般に、ユーザー入力を別の形式のマークアップまたは別の言語と混合する場合は、そのコンテキストに入れる前に、その言語の要素を入力からエスケープまたは削除する必要があります。
上記の最後のポイントは次のポイントに続きます。多くの人は、元の入力を常に維持する必要があると感じています。これは、後でデータを別の方法で使用することに決めた場合、たとえば、新しいコンテキストでHTMLタグが大したことではない場合に、非常に理にかなっています。また、サイトが何らかの形で侵害された場合、正確な入力が記録されます。
HTMLページでの表示を目的としたユーザー入力のHTMLタグに特に関連する:ユーザーがHTMLタグを入力する理由が考えられる場合は、単純にエスケープします。そうでない場合は、表示する前にそれらを取り除きます。