7

クライアント側の JavaScript では、セキュリティが存在しないか非常に難しいことを知っています。サーバー側のコードは、最終的に誰にデータを渡すか、誰からデータを受け取るかを決定する必要があることを知っています。

とはいえ、次のことは大丈夫です。「わかりました」とは、これが新しい人気のあるトレンディでクールな Web アプリで使用された方法であるかどうかを意味します。「Super Cool Web App Hacked, change your password!」が表示されないことを知って、夜寝てもいいですか。この実装の結果として、HN と Reddit (または人々が気にかけているその他の情報源) のいたるところに。

安全でない場合。なんで?その情報 (ユーザー名とパスワード) はどのように取得できますか?

安全なら?あなたはどれくらい確信がありますか?なぜ安全なのですか?私が明らかにできないこと以外に、その情報を取得するのを妨げているのは何ですか。

部分的な回答は大歓迎です。より良い理解を求めているだけです。


編集

ユーザーの資格情報を盗もうとするケースについて考えています。私の理解では、1.) 他の JavaScript (XSS などを介して) が Cookie にアクセスでき、2.) Cookie は平文で渡されるため、Cookie は安全ではありません。私は SSL が 2 番目の問題を処理すると考えており、XSS を防ぐことができると仮定します。Cookie が安全になったように見えますね。

私は、Cookie を安全でなくするのに役立つと思われるブラウザーの脆弱性をいくつか認識しています。それが私がこの質問をするようになった理由です。クッキーを安全でなくするすべてのことを考えると、これ (以下のコード) はより良いのでしょうか?


http://jsfiddle.net/KTastrophy/vXEjm/1/または以下のコードを参照 (Chrome でのみテスト済み)

<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
        <form id="login">
            <div>
                <label for="username">Username</label>
                <input id="username" name="username" type="text" />
            </div>
            <div>
                <label for="password">Password</label>
                <input id="password" name="password" type="password" />
            </div>
            <div>
                <input id="submit" name="submit" type="submit" value="Login" />
            </div>
        </form>
    </body>
    <script type="text/javascript">
        ;(function () {
            "use strict";
            var login, user = {};
            login = document.getElementById("login");
            login.onsubmit = function (event) {
                event.preventDefault();
                user.username = document.getElementById("username").value;
                user.password = document.getElementById("password").value;

                /*
                    use the username and password here to do
                    an API request over SSL using HTTP Auth
                 */
            }
        }());
    </script>
</html>
4

5 に答える 5

7

JavaScript に格納された機密性の高い値を扱う場合、主なセキュリティ上の懸念が 2 つあります。

  1. 機密性の高い値は、ソースでプレーン テキストとして表示できます。
  2. ページ上の別の JS 関数がオブジェクトに到達し、それらの値を取得できます (つまり、XSS 攻撃)。

上記の 2 番目の項目は、1 つのページに複数のソースから実行されているアプリ (Facebook アプリなど) がある場合に、より関連性が高くなります。このような場合、名前空間へのクロージャーを使用して機密変数を公開しないように、事前に注意する必要があります。実際にはすでにこれを行っています。userオブジェクトはクロージャー内で宣言されています。これにより、ページ上の他の JS 関数がuserオブジェクトにアクセスできなくなります。

あなたの場合、あなた自身のものを除いてページに他のコードはなく、インジェクションの可能性は最小限であると仮定しています-あなたのコードは安全です:)

編集: Cookie にユーザー名とパスワードを保存することが安全でない理由は、ブラウザーを閉じた後もコンピューターに残っていることです。ハッカーが (さまざまな方法で) その Cookie にアクセスできる場合、問題が発生する可能性があります。ブラウザーが閉じた後はクライアント側に何も保存されないため、上記で行ったことは安全です (ブラウザーが開いている間は、他の JS は保存した値にアクセスできません)。クッキーに何かを入れたい場合は、ある種の公開/秘密認証キーを保存する方がよいでしょう。これについては多くの議論があります。このトピックに関する完全な「ベスト プラクティス」の記事を次に示します

于 2012-08-01T23:09:48.750 に答える
2

保存しているデータがソース コード内にある場合は、関数のtoStringメソッドを使用して関数本体をソース コードに変換できます。

function f() {
  var cryptoKey = "ABGASDJEOTATJKASDTNM...";
}
alert(f);

データがソース コードに表示されるのではなく閉じられており、その関数がevalその本体で呼び出す方法がない場合、最新のインタープリターでははい。

古い Netscape インタープリターはeval、 を介して関数内でコードを実行するために使用できるように拡張されましたeval("nameOfLocalVariable", fnToStealFrom)

関数がその引数の 1 つを呼び出す場合、それは as in から盗まれる可能性があります。

var f = (function () {
  var x = "secret";
  return function (a, b) { return a(b + x.length); };
})();
f(eval, "x//");

EcmaScript 3 インタープリターと、おそらくいくつかの EcmaScript 5 インタープリターの秘密を盗みます。

于 2012-08-01T23:18:15.287 に答える
1

入力ボックスの値を JavaScript 値に保存することはまったく問題ありません。ユーザーが入力したので、明らかにそれを知っているからです。

でも!通常、ユーザーのパスワードをプレーン テキストとしてどこにでも保存することは嫌われます。

編集

SSL は、悪意のあるオブザーバーがメッセージを傍受して再作成することを非常に困難にします (時間があれば不可能ではありませんが、ほとんどの Web がこれを安全なものとして使用するのに十分です)。そのページで入力された javascript 変数に 1 つのパスワードを一時的に保存しても問題ありません。ただし、サーバーから平文で送信しないでください。不適切な見出しが表示されます。

于 2012-08-01T23:24:37.887 に答える
0

いいえ。できること、する必要があることは次のとおりです。

  • データベースを保護します。パスワードをソルトハッシュなどとして保存します。
  • 接続を保護します。SSL を使用する必要があります。

クライアント側の JavaScript コードには、セキュリティがない場合があります。ユーザーはすべてのデータをプレーン テキストとして入力するため、ページで実行されているすべてのスクリプトからアクセスできます。したがって、 XSSを防止する必要があります。確かに、Cookie はドメインで実行されているすべてのスクリプトで直接利用できますが、一部の機能のスコープに隠されているデータは「グローバル変数」ではありませんが、すべての悪意のあるスクリプトは、独自のアプリケーションと同じようにアクセスできます。

@your code: 確かに、誰もuserオブジェクトに外部からアクセスできません。しかし、誰でもパスワード入力要素にアクセスでき、ブラウザ オブジェクトをハイジャックして API リクエストをスパイすることができます。

于 2012-08-02T00:13:21.667 に答える
0

あなたの例にあるように、あなたは完全に安全です。

ただし、これは Cookie を置き換えるものではありません。あなたの例では、パスワードをコードにローカルに保存していますが、Cookie とは異なり、これらの値を後で使用することはできません。

値をまったく保存せず、ssl 経由で従来の http 認証を使用することをお勧めします。

于 2012-08-02T00:31:06.327 に答える