私はたまたまXSSとそれを回避する方法について読みました。私が読んだことから、Webアプリケーションをある程度XSSで安全にするには、入力フィルタリング、アプリケーションコードの適切な処理、および出力エンコーディングが必要であることがわかりました。いくつかの記事を読んだ後でも、いくつかの疑問が残っています。
jQuery.text( "untrusted_data")またはelement.text = untrusted_dataを試したところ、ブラウザはコンテンツを完全にエンコードしているようですが、クライアント側のエンコードは信頼されるべきではなく、「常に」サーバー側でエンコードします。クライアント側のエンコーディングが安全でないと見なされるのはなぜですか?
jQuery.val(untrusted_data)またはelement.value = untrusted_dataを使用して値を設定しようとしたときはいつでも、十分に安全であるように思われます。それで、それは本当にXSS安全ですか、それとも私はここでいずれかのケースを見逃しましたか?
- また、jQuery.setAttribute(attrName、untrusted_data)とsetAttribute(attrName、untrusted_data)は、属性名にURLコンテキストベースの属性(src、hrefなど)またはイベントハンドラー( src、hrefなど)が含まれていない場合にのみ、一般的に安全であると見なされることをどこかで読みました。 onClick、onMouseOverなど)。その場合、setAttribute( "href"、untrusted_data)を使用してhref属性を設定するにはどうすればよいですか?サーバー側からのencodeForHtmlAttribute(untrusted_data)は正しいアプローチ方法ですか?
- ダイナミックHTMLの作成をどのように処理する必要がありますか。以下の例を考えてみましょう
<div id="divName1" onClick="copyData()">untrusted_data</div>
<div id="divName2"></div>
function copyData()
{
var divValue = jQuery("#divName1").html();
jQuery("#divName2").html(divValue);/XSS Here
}
ここで達成したいのは、divName1からテキストを取得し、それをdivName2のコンテンツに貼り付けることです。上で書いたコードはXSSに対して脆弱です。これをに変更できます
jQuery( "#divName2")。text(divValue)
したがって、これによりエンコーディングが保証されますが、私が理解したように、クライアント側のエンコーディングは安全ではなく、サーバー側のエンコーディングのみを使用する必要があると言います。クライアント側のエンコーディングを使用せずにXSSセーフになるようにこれをどのように書く必要がありますか?私はここで少し混乱しています:(。これらの疑問を解決するために私を助けてください。