0

PHP アプリケーションを保守しています。最近、次のコードが XSS に対して脆弱であると報告されました。

from_name = jQuery("#from_name").val();
from_email = jQuery("#from_email").val();
subject = jQuery("#subject").val();
msg = "From: " + from_name + " (" + from_email + ")<br />";
msg = msg + "Subject: " + subject;
jQuery("#review").html(msg);

彼の提案は次のとおりです。

from_name = jQuery("#from_name").val();
from_email = jQuery("#from_email").val();
subject = jQuery("#subject").val();
msg = "From: " + from_name.replace(/</g,"&lt;").replace(/>/g,"&gt;") + " (" + from_email.replace(/</g,"&lt;").replace(/>/g,"&gt;") + ")<br />";
msg = msg + "Subject: " + subject.replace(/</g,"&lt;").replace(/>/g,"&gt;");
jQuery("#review").html(msg);

明らかでない場合、これは大幅に単純化されています。とにかく、彼の解決策は、.replace(/</g,"&lt;").replace(/>/g,"&gt;")私がすぐに問題を抱えていないが、A) 不要または B) 不完全であると思われる潜在的な要素をクリーンアップすることです。

.text代わりに使用することを検討しまし.htmlたが、テキストを適切にフォーマットできません。私が愚かなことを見落としていない限り。

元の要素が入力要素であるため、どのように脆弱であるかがわかりますが、これらの入力要素はデータベースから入力されます。データベースはもともと脆弱な $_POST を使用して入力されていましたが、すべての HTML タグを削除するなど、データベースにコミットする前にデータを検証しています。

私の意見では、XSS の唯一の可能性は、要素がユーザー (ばかげているように思われる) または JavaScript によって変更された場合、文字通りページ上にあります。関数は、悪意のある変更を取り除きます。

これは長ったらしい質問です。私の論理が合理的であることを願っています。

4

1 に答える 1

2

データベースへの入力をサニタイズしている場合、おそらく脆弱ではないということは正しいかもしれません。データベースに投稿されたコンテンツについても、途中でサニタイズすることをお勧めします。それを処理するより良い方法は、次のように $.text を使用することです。

from_name = jQuery("#from_name").val();
from_email = jQuery("#from_email").val();
subject = jQuery("#subject").val();
var subjectDiv = jQuery('<div>').attr('id','subjectDiv').text('Subject:'+subject);
var fromDiv = jQuery('<div>').attr('id','fromDiv').text('From: '+from_name+ ' (' +from_email +')');
jQuery("#review").empty();
jQuery('#review').append(fromDiv);
jQuery('#review').append(subjectDiv);
于 2012-05-24T16:51:34.990 に答える