13

重複の可能性:
Javascriptに定数はありますか?

サードパーティが変更できないように、JavaScriptで最終値の静的を宣言する方法はありますか?

私が持っているのは記事共有アプリケーションで、無料のユーザーが広告でサポートされています。私がやりたいのは、コンテンツのストレージ変数を変更することで、無料のユーザーがinnerHTMLコンテンツを変更できないようにすることです。

現在私が持っているのは、ユーザーのWebサイトにある記事のinnerHTMLを5秒ごとにリロードするタイマーであり、リロードの値を変数に格納しています。

ただし、jsbeatifyを使用する天才が、どの変数が広告を削除するための鍵を握っているのかを調べてそれを変更すると、収益と製品の露出が失われます。

内部変数の変更を防ぐ方法は?


アップデート

これは私が思いついたものの最終結果です:

http://jsfiddle.net/PgdYP/1/

<div id="specialdiv"></div>
<input type="button" value="try to change the function i to do something different" onclick="t.i = function(){alert(data.secret);}"><BR>
<input type="button" value="set function to null out of spite" onclick="t=null;">


 <script type="text/javascript">
    e = function(){var data = { };
    Object.defineProperty(data, 'secret', {
       value: "Hello world!",
       writable : false,
       enumerable : true,
       configurable : false
       });this.z=function(){window.setTimeout("try{document.getElementById('specialdiv').innerHTML =   '"+data.secret+"';t.i.z();}catch(err) {document.body.innerHTML=err;}",5000);}}
        g = function(){};
        g.prototype = new e();e=null;window.t = {}
        Object.defineProperty(window.t, 'i', {
        value: new g(),
        writable : false,
        enumerable : false,
        configurable : false });g = null;
        window.t = Object.freeze(window.t); t = Object.seal(window.t);
        t.i.z();
    </script>

これは、ソースからコードをコピーするだけで困難になるように、パック形式で表示されます。このようにして、コードをコピーして貼り付けるだけの作業が最大化され、自動化が非常に困難になります。

回答ありがとうございます。

4

2 に答える 2

21

はいあります。少なくともオブジェクト プロパティについては、ES5 により、プロパティ記述子フラグを手動で変更できるようになりました。だから私たちはそれを次のようにすることができます

var data = { };

Object.defineProperty(data, 'secret', {
    value: 42,
    writable : false,
    enumerable : true,
    configurable : false
});

このようにして、変更も削除もできない内secretの値を持つプロパティを作成しました。42data

ここでの注意点は、天才(あなたがそう呼んだように) もこのコードを見つけて、それを変更するだけで、必要に応じてコンテンツを変更できるということです。その方法では、安全なフロントエンド JavaScript を作成することはできません。コードは、いつでも誰でも平文で利用できます。


これをより完全にするためfreezeに、ある時点でオブジェクトを作成し、オブジェクトのプロパティを列挙削除、および変更するObject.freeze()ためのオプションを使用しておよび/またはObject.seal()シャットダウンすることもできます。

しかし、ここでも注意が必要です。これは、実行時に誤ってまたは意図的に変更されるのを防ぐために、独自のコードまたは外部コードに影響を与えることを目的としています。開発者はスクリプトの実行を停止するだけでよいため、これが有効になる前に開発者を停止する方法はありません。

于 2012-10-25T08:53:50.317 に答える
3

constキーワードを試してください。不変変数を作成する必要があります。

于 2012-10-25T08:54:00.187 に答える