4

誰かがあなたのHTMLを変更したかどうかを確認する簡単な方法はありますか?私は現在、DOMからデータを取得してバックエンドに送信するコードを作成しています。バックエンドでは、もちろんサニタイズされて正確性がチェックされますが、パスでそれを回避する方法があるかどうか疑問に思いました。

たとえば、番号が含まれる非表示の入力があり、サーバーに送信する前に誰かがFirebugでその番号を変更した場合、サーバーにリクエストを送信する前に実際のHTMLが変更されたかどうかを確認する方法はありますか?基本的に彼らにHEYBUDDYSTOP MESSINGMYSTUFFと伝えます。

これが可能かどうかは完全にはわかりませんが、可能であれば、その方法がわかりません。

4

4 に答える 4

4

うーん、あなたのユーザーのブラウザ上の HTML は実際にはユーザーのものだと思います。URL、HTML フォームの入力パラメータ、および Cookie の形式でサーバーに到着するまで、それらは再びあなたのものではありません。したがって、そのようなデータを引き続き検証する必要があります。信頼できるクライアント エクスペリエンスを可能にする特効薬はありません。

于 2011-03-06T02:33:46.520 に答える
3

誰かがinputFirebug で JavaScript を使用して非表示の要素を変更しているかどうかを確認できますが、その考えはばかげているように思えます。

重要な検証はすべてサーバー側で行う必要があります。

クライアントが送信するものが正確であることに依存することはできません。誰かが本当に「自分のものをいじりたい」と思った場合、(たとえば) 簡単に Python スクリプトを記述して、サーバーにデータを送信することができます。


これは、私のコメントでほのめかしていたもののjQueryベースのサンプルです。

ライブデモ #2

  • [送信] をクリックします。背景が緑色に変わります - 何も変更されていません。
  • hidden の値を変更しinput、[送信] をクリックします。背景が赤くなります - 何かが変更されました。

HTML:

<form id="myForm" method="post" action="">
    <input type="hidden" value="123" />
    <input type="hidden" value="456" />
    <input type="submit" />
</form>

JS #2:

$('#myForm input[type="hidden"]').each(function() {
    $(this).data('originalValue', $(this).val());
});

$('#myForm').submit(function(){
    $(this).find('input[type="hidden"]').each(function() {
        if ($(this).val() != $(this).data('originalValue')) {
            $('body').css('background', 'red');
            return false;
        }
        //just for testing:
        $('body').css('background', 'green');
    });
    return false;
});
于 2011-03-06T02:35:11.950 に答える
3

非表示の値と一緒に、非表示の値とクライアントに送信されない秘密の値を含む複雑な計算の結果である別の値を送信できます。次に、非表示の値を受け取ったら、最初の計算を逆にする別の計算を実行します。秘密の値が戻らない場合は、隠し値が変更されたことがわかります。

もちろん、これはまだそれほど安全ではありません。誰かがあなたのサイトで簡単にいくつかの実験を行い、その秘密の値があなたの非表示の値と検証値のみに基づいているものを見つけ出し、検証値も変更する可能性があるからです.

このタイプの検証をクラックすることをかなり困難にする (ただし、不可能ではない) 計算を考え出すことは可能です。ただし、そのような計算を考え出し、新しいエクスプロイトが発生しないようにその上にとどまることに時間と労力がかかるため、データを受け取ったらサニタイズするだけの方がよいでしょう。

私の意見では、ユーザーが受け取ったデータに依存しない方がよいでしょう。あなたが求めていることを実行するために実行できるトリックは確かにあり、これはその 1 つかもしれませんが、これらのトリックのほとんどは、攻撃者が十分な時間を与えれば理解できる可能性が最も高いものです。

于 2011-03-06T02:50:40.007 に答える
2

期待値のコピーを JavaScript に埋め込んで保持するなど、JavaScript でできることはいくつかあります。

var originalHiddenFieldValue = document.getElementById("myHiddenField").value;

... 後で...

if (originalHiddenFieldValue !== document.getElementById("myHiddenField").value)
    alert("Hey, stop it!");

ただし、結局のところ、ユーザーが行う必要があるのは、送信ボタンのイベント ハンドラーをデタッチして検証をオーバーライドするだけで、コードは役に立たなくなります。彼らが Firebug を使用して値をオーバーライドできるほど頭が良ければ、スクリプトも変更するためにもう少し進んで進んでくれるだろうと確信できます。

これらのことをチェックしようとしている場合、100% の自信を持ってそれを実行できる唯一の方法は、サーバー側の非表示フィールドをチェックし、とにかく行っていると言ったように値を比較することです。

于 2011-03-06T02:50:37.030 に答える