以下は、ユーザーがサイトで作成したページの簡単な例です(フォームを記入して作成した後、ページの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="<script>alert('hi');</script>" />
<div id="destinationdiv" style="width:10px;height:10px;background-color:red;"></div>
</body>
</html>
UPDATE:私は今のところ一緒に行くよソリューションは、3つの部分があります。
、ユーザーが作成したページを保存すると、私は彼らの入力にPHPのstrip_tags()を実行します。これらはタイトルや宣伝文句のような短いテキスト文字列なので、HTMLを入力できるユーザーはほとんどいません。それは他の状況には適していないかもしれません。
ユーザーが作成したページが表示されているときに、ユーザーが入力値属性に入力した内容を入力するのではなく、その入力をdivに入れます。
私はそのdivの値を.text()(.html()ではなく)を使って取ります。私はアンダースコア関数でそれを実行します(下記参照)。
最初のステップをスキップしてシミュレートすることを含めてこれをテストすることは機能しているようです。少なくとも私は逃したものがないことを望んでいる。あなたは機能の全体アンダーライブラリを使用したくない場合は
この関数はタグ間でのみ動作することに注意してください。必ずしもhtml属性ではなく、onclickのようなjavascriptイベントハンドラやスクリプトタグやcssでは使用できません。 OWASPのxss防止チートシートを参照してください。 – Erlend
Clickable:[OWASP XSS Preventionチートシート](https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet) –