2012-02-27 14 views
1

以下は、ユーザーがサイトで作成したページの簡単な例です(フォームを記入して作成した後、ページのURLを取得します。下記は作成したページのHTMLです)。潜在的に危険なユーザー入力を隠し入力フィールドからDOMに転送する

この例では、非表示の入力フィールドの値をとって、それをそのままDOMに入れています。その結果、アラートが発生し、XSS攻撃をシミュレートします。

このようなことを防ぐにはどうすればよいですか? #sourceinputの値は、下のページを表示している同じユーザーまたは別のユーザーによって以前に入力されたもので、ユーザーの入力はタグを削除するためにフィルタされませんでした。実際のケースでは、jquery.tooltip.jsプラグインがあり、bodyHandlerコールバックがあります。マウスオーバーすると、bodyHandlerコールバックによって非表示の入力が表示され、ユーザーに表示されます)。

これに対処する方法の1つは、オン入力;私はそれを解決するように見えるように隠されたテキストフィールドに入るものを制御します。

別の方法では、JavaScriptのタグを取り除くことであろうが、これらのいくつかは、100%有効であると思われない:

Strip HTML from Text JavaScript

は私が欠けているベストプラクティスのいくつかの並べ替えがあり、またはそれらの2つの最善の方法ですか?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<head> 
<title></title> 
<script type="text/javascript" src="https://www.google.com/jsapi"></script> 
<script>google.load("jquery", "1.7.1");</script> 
<script> 
$(document).ready(function() { 
    var badHTML = $('#sourceinput').val(); 
    $('#destinationdiv').html(badHTML); 
    //$('#destinationdiv').text(badHTML); 
}); 
</script> 
</head> 

<body> 
<input type="hidden" id="sourceinput" value="&lt;script&gt;alert&#40;&#039;hi&#039;&#41;;&lt;/script&gt;" /> 
<div id="destinationdiv" style="width:10px;height:10px;background-color:red;"></div> 
</body> 
</html> 

UPDATE:私は今のところ一緒に行くよソリューションは、3つの部分があります。

  1. 、ユーザーが作成したページを保存すると、私は彼らの入力にPHPのstrip_tags()を実行します。これらはタイトルや宣伝文句のような短いテキスト文字列なので、HTMLを入力できるユーザーはほとんどいません。それは他の状況には適していないかもしれません。

  2. ユーザーが作成したページが表示されているときに、ユーザーが入力値属性に入力した内容を入力するのではなく、その入力をdivに入れます。

  3. 私はそのdivの値を.text()(.html()ではなく)を使って取ります。私はアンダースコア関数でそれを実行します(下記参照)。

最初のステップをスキップしてシミュレートすることを含めてこれをテストすることは機能しているようです。少なくとも私は逃したものがないことを望んでいる。あなたは機能の全体アンダーライブラリを使用したくない場合は

答えて

0

はここで、Underscore.jsが使用するエスケープ関数です:

var safe_html = escape("<b>Potentially unsafe text</b>"); // "&lt;b&gt;hello&lt;&#x2F;b&gt;" 
$("#destination").html(safe_html); 

のように使用

var escape = function(string) { 
    return (''+string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\//g,'&#x2F;'); 
}; 

これはよく書かれているとにはよく知られています私は自分のものを転がすことを勧めません。

+1

この関数はタグ間でのみ動作することに注意してください。必ずしもhtml属性ではなく、onclickのようなjavascriptイベントハンドラやスクリプトタグやcssでは使用できません。 OWASPのxss防止チートシートを参照してください。 – Erlend

+2

Clickable:[OWASP XSS Preventionチートシート](https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet) –

0

私はあなたがコメントアウトしたと言うでしょう(jqueryのtext()を使う方が良い選択肢です)。それは、テキストがあなたが望むテキストのままでいることを確認します。フィルタリングまたはストリッピングは、入力内の数式を削除するなどの望ましくない副作用を伴う可能性があります( "xは< 5")。

+0

私の例題は簡略化されています。私はjquery.tooltipを使用しているので気になります。 jsプラグイン。 – user350139

0

Do Nothing。

ユーザーを自分から保護しようとしています。ユーザーAがユーザーBを害することはできません。また、ユーザーAは、アドレスバーとxss自身にjavascript:alert('hi')と入力することもできます。そして、どんなjavascriptエスケープ関数を作成しても、精通したユーザーはいつでもそれをバイパスできます。全体として、その無意味な追求。

ここで、ユーザーがサーバー側で入力した内容を保存する場合は、間違いなくフィルタリングする必要があります。あなた自身で何かを構築しないでください。サーバー側言語に応じて、いくつかのオプションがあります。 OWASP's AntiSammyはそのような解決策の1つです。

ユーザが入力したhtmlをサーバ側に保存する場合は、antisammyなどのライブラリで実行してから、データベースに保存してください。退出時には、データベース内の何が消毒されているかを知っているので、エスケープせずにHTMLをダンプするだけです。

+0

これは、サイト上にページを作成できるようにするサイトのためのものです。だからBad Guyは彼が作成したページにXSSを置くことができ、無邪気なユーザーはそのページを閲覧して影響を受けることができます。 – user350139

関連する問題