私のソーシャルネットワーキングサイトはw3cxhtmlで有効ですが、ユーザーはブログのレポートなどを投稿したり、アンパサンド文字を入力したりして、検証を台無しにすることがあります。どうすればこれを修正できますか?検証を台無しにする可能性のある他の単一の文字に注意する必要がありますか?
3 に答える
ユーザーが作成したコンテンツを表示する場合は、htmlspecialchars()関数を使用して実行します。
一般原則として、検証やフィルタリングを行わずに、ユーザーが送信した(または実際には外部の)コンテンツをページに直接含めるのは間違いです。検証エラーを引き起こすだけでなく、「ページの破損」や大きなセキュリティホール(クロスサイトスクリプティング攻撃)を引き起こす可能性もあります。
100%信頼されていない場所からデータを取得する場合は常に、何らかの方法でデータを安全にする必要があります。これを行うには、次の一部またはすべてを実行します。
- 特殊文字がそれらを表すHTMLエンティティに置き換えられるように、テキストデータをエスケープします。
- 安全でないHTMLタグを削除またはフィルタリングします。
- HTMLに安全でないまたは違法な構造が含まれていないことを検証します。
ユーザー入力がテキストとして解釈されることを意図している場合は、主にオプション1を検討しています。ユーザーにHTMLを使用させる場合は、オプション2と3を検討します。4番目のオプションは、MarkdownやbbCodeなどのより制限の厳しい非HTMLマークアップをユーザーに使用させ、そのマークアップとHTMLの間で(うまくいけば)セキュリティホール、ページを壊す構造、または他の恐ろしいものの注入を許可しないライブラリ。
ユーザーがHTMLマークアップを入力できるようにすることはお勧めできません。
これにより、あらゆる種類の厄介なことが可能になります。特に、クロスサイトスクリプティング(XSS)の悪用や、隠されたスパム(検索エンジンのボットではなく、あなたから隠されたもの)の注入が可能になります。
あなたがすべき:
を使用してすべてのHTMLタグを消去し、。を使用
htmlspecialchars()
して改行のみを保持しnl2br()
ます。非常に特定のタグ(phpBBやWikiのようなマークアップなど)のみを許可する独自の安全なマークアップを実装することで、フォーマットを許可する場合があります。HTML Purifierを使用して、潜在的に危険なマークアップをすべて確実に排除します。PHPの
strip_tags()
関数は根本的に壊れており、ホワイトリスト引数を使用すると、属性に危険なコードが含まれる可能性があります。