UserJS。 パート3:セキュリティ

この記事では、いくつかのuserjsトリックの危険性とこの危険に対処する方法について説明します。



シリーズの他の記事:



Liveconnect



この技術の危険性は明らかです。 あるアドレスから高度な機能(たとえば、クリップボードの操作)へのアクセスを許可するとすぐに、このアドレスからのすべてのスクリプトが独自の目的で(たとえば、バッファーの内容をサイトに送信します-突然パスワードがあります)



解決策は、「http://0.0.0.0/」という1つのアドレスへのアクセスのみを許可し、このアドレスでフレームを開き、XDMを介してすべてのアクションを実行することです。 欠点は、すべての呼び出しが非同期になることです。 しかし、なぜ安全のためにそれをしないのですか。 はい、そしてこれにはいくつかのプラスがあります-ページ上のスクリプトは、長い同期呼び出しを見込んでハングしません。



ここで、XDMを保護する必要があります。



Xdm



ページ上の任意のスクリプトは、iframeを見つけてメッセージを送信できます。 メッセージ形式を知っているだけです。 userjsがネットワークに投稿されている場合、見つけることは問題ではありません。 はい、userjsを自分で作成した場合でも、多くの場合、形式を推測するのは簡単です。



そのため、タスクはフォーマットを読み取り不可能にすることです。 これを行うには、次のものが必要です。





機能を保存します



しかし、これでもセキュリティを確保するには十分ではありません。



残念ながら、userjsはページのコンテキストで実行されます。 これは、ページのスクリプトによるオブジェクトのすべての変更がuserjsに反映されることを意味します。



userjsのパスワード検証が次のようになっていると仮定します。

 if(ev.data.substring(0、password.length)== password){...}




次に、ページ上のスクリプトを実行できます。

 String.prototype.substring = function(start、len){alert(this);  }


パスワードを取得します!



userjsの重要な場所で使用される関数を保存する必要があります。

 //スクリプトの最初に。
 var functionCall = Function.prototype.call;
 var stringSubstring = String.prototype.substring;

 //イベントハンドラ内。
 stringSubstring.call = functionCall;
 if(stringSubstring.call(ev.data、0、password.length)== password){...}



All Articles