任意の数のクエリ文字列パラメーターを受け入れるHTMLページがあり、ユーザーが自分のページのリンクをクリックしてアクセスする次のページに渡す必要があります。基本的に、ユーザーが
http://example.com/some/page.html?param1=123¶m2=567&smthelse=abcde
これらのクエリ文字列パラメータのほとんどには、追跡の性質があります。ユーザーがこのページの特定のリンクをクリックするか、特定のPOSTフォームを送信すると、これらすべてのクエリ文字列が次のページに渡されることを確認する必要があります。
メンテナンスが多いため、可能であれば、次のページに渡すことを許可する必要があるクエリ文字列パラメーターをホワイトリスト/ブラックリストに登録しないようにしています。代わりに、jQuery/Javascriptを使用してすべてのクエリ文字列を動的に読み取り、アンカーのhref属性とフォームのアクション属性を更新して、これらのURLにwindow.location.search
値全体を追加することを計画しています。
例( jsbin ):
$(document).ready(function() {
var pageQsParams = window.location.search.split('?')[1] || '';
var newLinkUrl = $('.link').attr('href') + (pageQsParams ? '?' + pageQsParams : '');
$('.link').attr('href', newLinkUrl);
var newFormUrl = $('#form').attr('action') + (pageQsParams ? '?' + pageQsParams : '');
$('#form').attr('action', newFormUrl);
});
このコードはXSSまたはフィッシングに対して脆弱ですか?他のセキュリティ上の脆弱性はありますか?それを行うより良い方法はありますか?
このコードは安全です。
jQuery.attr
は内部的に setAttribute
を使用するため、特殊文字を使用して回避することはできません。
Href/action属性を設定するので、攻撃者がURLを操作できないことも確認する必要があります。
先頭に?
はクエリ文字列に対して、最終的なURLでクエリ文字列部分を開始し、以前のURLが整形式であり、http
またはhttps
スキームを使用している限り、パス/ホスト操作を防止します。
以前のURLがjavascript
スキームを使用した場合、XSSベクトルが可能でした。