-1

XSS を軽減し、文字を正しく表示するために、いつ、どのようにエンコードするかを理解し始めています。

ただし、いくつかの html をページ、具体的にはクエリ文字列に書き込むクライアント側スクリプト (JavaScript) があります。

このために、javascript の "encodeURIComponent" 関数を使用して、外部 json ファイルに保存されているユーザー入力の処理を支援しました。

これらの値をどのようにエンコードしようとしても、山かっこが値のいずれかにある場合、毎回実際にページがロックされますが、json 値に山かっこがない場合は完全に機能することに気付きました。

最初にhtmlエンコーディングを試してから、「encodeURIComponent」を使用して、これを逆に試しました。JavaScript には生来の html エンコーダーがないため、独自の簡単なエンコーダーを作成しました。ここです:

function htmlEncode (input)
{

    while(input.indexOf("&") > -1)
    {
        input = input.replace("&", "&")
    }
    while(input.indexOf("<") > -1)
    {
        input = input.replace("<", "&lt;")
    }
    while(input.indexOf(">") > - 1)
    {
        input = input.replace(">", "&gt;")
    }
    while(input.indexOf("\"") > -1)
    {
        input = input.replace("\"", "&#x22;")
    }
    while(input.indexOf("'") > -1)
    {
        input = input.replace("'", "&#x27;")
    }
    while(input.indexOf("/") > -1)
    {
        input = input.replace("/", "&#x2F;")
    }

    return input
}

そして、値をページに書き込むコードの JavaScript スニペットを次に示します (html エンコーダーなし):

stringCompiler = "/Event htms/Event.cshtml?title=" + encodeURIComponent(jsonObj.events[i].title) +
                        "&explanation=" + encodeURIComponent(jsonObj.events[i].explanation) + "&dateString=" +
                        encodeURIComponent(jsonObj.events[i].dateMonth) + "-" + encodeURIComponent(jsonObj.events[i].dateNumber) + "-" + encodeURIComponent(jsonObj.events[i].dateYear);

残念ながら、それ以上の情報を提供することはできません。なぜなら、それがロックアップすると、ハードにロックアップし、診断ツールを実行できない (右クリックやスクロールさえできない) からです。

何かを 2 回エンコードするのはばかげていると思いましたが、「encodeURIComponent」だけを使用して山かっこがブラウザーをロックしたとき、html エンコードも試してみようと考えましたが、どちらの方法でもロックアップします。

私にできることはありますか、またはjsonファイルに保存するときに山括弧を防ぐ必要がありますか?

-----------------------これは私が以下の機能で見ているものです-----------------

あなたの機能

4

1 に答える 1

3

あなたはそれよりもはるかにうまくやることができます。私の良き友人、文字「g」をお届けします。

function htmlEncode (input) {
  return input.replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/\//g, '&#x2F;')
    .replace(/'/g, '&#x27;')
    .replace(/"/g, '&#x22;');
}

「&」が原因でコードに問題が発生しています。あなたのコードは言う:

  1. この文字列にアンパサンドはありますか?
  2. はいの場合、最初のものを&amp;
  3. 手順 1 に進みます。

問題が見えますか?文字列には常にアンパサンドが含まれます。.replace()正規表現で「global」修飾子を使用すると、1 回の呼び出しですべてを置換できます。

これを行うには別の方法があります。関数の引数を 1 回呼び出すだけで、より高速になる可能性.replace()がありますが、不必要に複雑だと思います。

入力すると自分でわかるように、入力で「ハング」しencodeURIComponent()ませ

encodeURIComponent("<>&");

ブラウザのコンソールに。

于 2013-03-05T20:30:18.117 に答える