2009-03-31 7 views
11

私はLAMP環境(debian、apache、php、mysql)で動的にWebサイトのいくつかの側面(yes、何らかのcms)を管理できるWebアプリケーションを開発しました私のユーザーはリスクなしでHTMLコードを挿入できますか?

さて、たとえば、私のサーバー上のプライベートエリアにニュースを作成すると、cURLリクエスト(またはajax)を介して自分のウェブサイトに公開されます。

ニュースは、WYSIWYGエディタ(fck、おそらくtinyMCE)で作成されます。

私はhtmlタグを許可できませんが、どうすれば安全ですか? どのようなタグを削除する必要がありますか(javascripts?) それはサーバーセーフであることを意味しますが、「法的に」安全な方法は? ユーザーが自分のアプリケーションを使用してxssを作成する場合、法的に問題がありますか?

答えて

15

PHPを使用している場合、優れた解決策はHTMLPurifierを使用することです。これは、悪いものをフィルタリングするための多くのオプションがあり、副作用として、よく形成されたHTML出力を保証します。私は敵対的な環境になる可能性のある迷惑メールを見るために使います。

+0

私はこのやり方に加え、いくつかの個人的なステップをとることに決めました。 htmlタグ( 'WYSIWYGエディタのcos')を使用して特定のものだけを制限する私のcostumersに完全な自由を与える必要があります。私はそれが最新のセキュリティドアで更新され続けることを願っています。 – Strae

+1

私は自分の努力を信頼することをもっと信頼しています.... – DGM

2

HTMLを許可するのではなく、HTMLに変換できる他のマークアップが必要です。ユーザー入力から不正なHTMLを取り除くしようとしていることは、ここ

<script etc="..."> 
+0

Uだと思うので、記事で、このように誰もがスクリプトインジェクションを通して、あなたのウェブサイトをハックすることはできませんブラックリストではなくホワイトリストを歌い、この問題を解決します。 – Gumbo

+0

imgタグの回答を参照してください。http://stackoverflow.com/questions/701580/how-can-i-allow-my-user-to-insert-html-code-without-risks-not-only-technical-r/701609#701609 – cjk

+0

XSSはBBcodeのような他のマークアップ言語でも可能ですので、実際には何も修正されません。ホワイトリストアプローチはかなりうまく機能します。 – troelskn

6

一般的な最善の戦略を残すこのから削除する例

<scr<script>ipt etc="..."> 

ため、ほとんど不可能であることは、特定のタグをホワイトリストに登録することで、あなたが安全と考えると属性エスケープ/他のすべてを削除します。たとえば、わかりやすいホワイトリストは<p>, <ul>, <ol>, <li>, <strong>, <em>, <pre>, <code>, <blockquote>, <cite>です。あるいは、安全なHTMLに簡単に変換できる、人にやさしいマークアップをTextileまたはMarkdownのように考えてください。

+0

ホワイトリストを使用して許可されたタグにスクリプトを挿入できませんか? – jeroen

+0

それはあなたがそれらをエスケープする方法に依存します。 " ipt ..."のようなものを記述している場合は、最初に "」に移動し、エスケープ/削除されます。 –

+0

私はその属性についてもっと考えていましたが、あなたのホワイトリストに必要なタグがあるかどうかによって異なりますので、許可する必要があります。あなたが属性を許可するなら、あなたはonclick = ""などの範囲全体を取り除かなければならないでしょう、しかし、私はそれがかなり明白だと思います:) – jeroen

11

あなたが削除しようとしているものは本当に問題ではありません。誰かが常にそれを回避する方法を見つけるでしょう。参考として、XSS Cheat Sheetをご覧ください。一例として、

、どのようにあなたは、この有効なXSS攻撃を削除しようとしている。

<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29> 

あなたの最良のオプションは、許容可能なタグのサブセットのみを許可し、何かを削除しています。このプラクティスはWhite Listingとして知られており、XSSを防止するための最良の方法です(HTMLを禁止する以外にも)。

テストでチートシートを使用してください。あなたのウェブサイトでできるだけ多くの火を放ち、XSSを実行するいくつかの方法を見つけようとします。

+0

+1のチートシート –

0

タグを削除することが難しい場合は、ユーザーが有効なHTMLデータを入力するまで、HTMLデータ全体を拒否することができます。 次のタグが含まれていると、HTMLを拒否します。

フレームセット、フレーム、iframe、スクリプト、オブジェクト、埋め込み、アプレット。

また、あなたがあなた自身で提供したいので、あなたがメタデータを操作することを望まないため、頭(およびサブタグ)、本文、htmlは許可しないでください。

しかし、一般的に言えば、ユーザーが自分のhtmlコードを提供できるようにすると、常にセキュリティ上の問題が発生します。

0

HTMLをまったく許可するのではなく、BBCodeやMarkdownのようなHTML用のスタンドインを実装することを検討したいかもしれません。

2

stackoverflowが使用するホワイトリストアプローチのC#の例では、this pageを見ることができます。

1

Kohana's security helperです。私が覚えていることから、それは別のプロジェクトから取られました。

しかし、私はLFSR Consulting's answerから

<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29> 

をテストし、それが正しく、それを免れました。

-1

code that I should have just copy/pasted instead of screenshotting

それは私は、ユーザーが安全に投稿することができますしたいと私は使用することができ、わずか数のタグを許可するので、私はこのPHPのstrip_tagsの機能を使用し、あなたがそれを

$string = strip_tags($_POST['comment'], "<b>"); 
+0

これは質問への回答を提供しません。十分な[評判](https://stackoverflow.com/help/whats-reputation)があれば、[投稿にコメントする]ことができます(https://stackoverflow.com/help/privileges/comment)。代わりに、[質問者からの明確化を必要としない回答を提供する](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- i-do-代わりに)。 - [レビューの投稿](/レビュー/低品質の投稿/ 18479859) – codechurn

関連する問題