web-dev-qa-db-ja.com

JavaScriptを使用してクエリ文字列パラメーターをform.actionまたはa.hrefに追加しますか?

任意の数のクエリ文字列パラメーターを受け入れるHTMLページがあり、ユーザーが自分のページのリンクをクリックしてアクセスする次のページに渡す必要があります。基本的に、ユーザーが

http://example.com/some/page.html?param1=123&param2=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またはフィッシングに対して脆弱ですか?他のセキュリティ上の脆弱性はありますか?それを行うより良い方法はありますか?

4
vgrinko

このコードは安全です。

jQuery.attr は内部的に setAttribute を使用するため、特殊文字を使用して回避することはできません。

Href/action属性を設定するので、攻撃者がURLを操作できないことも確認する必要があります。

先頭に?はクエリ文字列に対して、最終的なURLでクエリ文字列部分を開始し、以前のURLが整形式であり、httpまたはhttpsスキームを使用している限り、パス/ホスト操作を防止します。

以前のURLがjavascriptスキームを使用した場合、XSSベクトルが可能でした。

1
Benoit Esnard