4

ということで、Chrome コンソールで JavaScript を実行できるようだということを今日知りました。私はあなたがこれを行うことができるとは思いもしませんでした。それは実際には本当にクールです。

私の Rails アプリには、外部の JavaScript ページがあります。そのページの変数のいくつかは、JS ファイル内のすべての関数がアクセスできるようにグローバルにしたいと考えています。たとえば、マップがあり、JavaScript ファイルでマップ オブジェクトをグローバルにしたいと考えています。これは、すべての関数が独自のマップ変数を作成するのではなく、1 つのマップ変数にアクセスし、複雑な操作を小さな関数に分割できるためです。

これはすべてうまくいっています。私はそれを行う方法を知っており、完全に機能しています。私の問題は、外部から変数を保護できますか? たとえば、Chrome コンソールからすべての JavaScript クラス変数の値を変更できます。また、マップなどのメソッドはアクセス可能で実行可能です。ページの 1 つでマップ設定をロックしたため、ズーム可能または移動可能ですが、コンソールから簡単に言うmap.setZoom(11)と、マップは 11 にズームされます.. 入力map.dragable = trueして、マップをドラッグすることができます.. これは本当に好きではありません..

ユーザーがマップのドラッグとズームを有効にすることは世界で最悪のことではないので、それほど悪くはありません..しかし、それでもこれを無効にしたいと思います。何か案は?

編集

回答とコメントをありがとうございます。私は、悪意のあるものを JavaScript に入れないようにして、マップ変数を必要に応じて関数に渡すなどして、人々の速度を低下させることに頼るつもりです。

4

6 に答える 6

6

即時呼び出し関数 (IIFE) 式を使用して、変数と関数がグローバル スコープで公開されるのを防ぐことができます。

var a = 10;

(function() {
    var b = 20;
})();

window.aを表示および変更できますaが、次の場合は実行できませんb:

ここに画像の説明を入力

ここで試してみてください

bInspector で編集する方法があることは間違いありませんが、それを理解する時間はありませんでした。ユーザーが表示可能なコードを変更できないようにするために時間を無駄にしないでください。

于 2012-11-01T18:09:10.147 に答える
5

できません。それらを無名関数にラップしても、ユーザーはデバッガーを介してそれらにアクセスできます。最後の手段として、彼は自分のマシンへのトラフィックを傍受し、JavaScriptを別のものに置き換えることができます。

結論:ブラウザのJavaScriptはクライアント側です。クライアントは彼がそれで好きなことを何でもすることができます。

于 2012-11-01T18:12:15.420 に答える
3

次のようなことを試してください。

(function(){
   //All of your current code
})();

まだ注意すべき点が1つあります。Chromeデベロッパーツールでは、JavaScriptを編集することもできます(サーバー上のJavaScriptファイルではなく、現在コピーを実行しています)。[Chrome開発ツール]-> [ソース]に移動すると、JavaScriptファイルを編集できます。

于 2012-11-01T18:10:00.723 に答える
2

できません。マップをグローバルに定義する必要があるとおっしゃっていますが、これは、誰でもアクセスできることを意味します。別のスコープでマップを定義してから、「パブリック」なもののみを定義できます。

(function() {
    var map = new Map();
    window.myMap = {
        goTo: function(lat, lng) {
            map.goTo(lat, lng);
        }
    };
})();
于 2012-11-01T18:12:28.260 に答える
1

アーキテクチャに応じて、これを実現する方法がいくつかあります。このメソッドを使用して、パブリック プロパティとプライベート プロパティを持つ再利用可能なコンポーネントを作成します。

var protectedScope = function () {
    var protected_var = 'protected';
    this.showProtected = function () {
        return protected_var;
    }
    this.public = 'public';               
};
var myObject = new protectedScope();

console.log('Public var: '+myObject.public); // outputs "public"
console.log('Protected via accessor: '+myObject.showProtected ()); // outputs "private"
console.log('Protected var: '+myObject.protected); // outputs undefined

キーワードを使用して宣言された変数または関数はvar、実質的に非公開になります。このメカニズムを使用する変数または関数はすべてthis.name「パブリック」になります。

この構造は真にパブリックまたはプライベートではないことを理解してください。そのような概念は言語の一部ではありません。これらの変数を取得する方法はまだあり、いつでもソースを表示できます。明確にしてください。これは、セキュリティの概念ではなく、コード編成の概念です。Chrome にはしばらくの間、この開発者コンソールがあり、他の主要なユーザー エージェントは同様のツールを含めるように移行しています (または既にそうしています)。ユーザーが JavaScript ランタイム環境に完全にアクセスできるようにする Firebug などのツールもあります。これは、開発者がまったく制御できる領域ではありません。

ここで試してみてください: http://jsfiddle.net/cf2kS/

もっと読む

于 2012-11-01T18:16:17.260 に答える
0
Object.defineProperty(map, 'zoom', {value:1});

また

Object.defineProperty(map, 'zoom',{
    set: function(){console.warn('Access denied!');},
    get: function(){return 1;}
    }); 

デモ

また

Object.defineProperty(Object.prototype, 'protect', {
    value:  function(ignore){
        var childObjects = [], ignore = ignore || [];
        ignore.push(this);      
        if(this instanceof MimeType)return; //Chrome Fix //window.clientInformation.mimeTypes[0].enabledPlugin[0] !== window.clientInformation.mimeTypes[0]
        for(var prop in this){
            if(typeof this[prop] === "unknown")continue; //IE fix
            if(this[prop] instanceof Object){
                var skip = false;
                for(var i in ignore)
                    if(ignore[i]===this[prop]){
                        skip = true;
                        break;
                    }
                if(!skip)childObjects.push(prop);   
            }       
            var d = Object.getOwnPropertyDescriptor(this, prop);
            if(!d || !d.configurable || !d.writable)continue;
            var that = this;
            (function(){
                var temp = that[prop];
                delete that[prop];
                Object.defineProperty(that, prop,{
                    set: function(){console.warn('Access denied!');},
                    get: function(){return temp;}
                });
            })();
        }
        for(var i = 0;i<childObjects.length;i++)
            this[childObjects[i]].protect(ignore);
    }  
});
this.onload=function(){this.protect();} //example

デモ

于 2014-04-23T10:23:57.550 に答える