この記事では、いくつかのuserjsトリックの危険性とこの危険に対処する方法について説明します。
シリーズの他の記事:
Liveconnect
この技術の危険性は明らかです。 あるアドレスから高度な機能(たとえば、クリップボードの操作)へのアクセスを許可するとすぐに、このアドレスからのすべてのスクリプトが独自の目的で(たとえば、バッファーの内容をサイトに送信します-突然パスワードがあります)
解決策は、「http://0.0.0.0/」という1つのアドレスへのアクセスのみを許可し、このアドレスでフレームを開き、XDMを介してすべてのアクションを実行することです。 欠点は、すべての呼び出しが非同期になることです。 しかし、なぜ安全のためにそれをしないのですか。 はい、そしてこれにはいくつかのプラスがあります-ページ上のスクリプトは、長い同期呼び出しを見込んでハングしません。
ここで、XDMを保護する必要があります。
Xdm
ページ上の任意のスクリプトは、iframeを見つけてメッセージを送信できます。 メッセージ形式を知っているだけです。 userjsがネットワークに投稿されている場合、見つけることは問題ではありません。 はい、userjsを自分で作成した場合でも、多くの場合、形式を推測するのは簡単です。
そのため、タスクはフォーマットを読み取り不可能にすることです。 これを行うには、次のものが必要です。
- 各ユーザーのパスワードを生成します。
- 各メッセージの先頭に追加します。
- 「BeforeEvent.message」イベントを使用して、メッセージについて最初に知るようにします。
- 適切なパスワードを持つメッセージのみを処理します。
- 「Event.preventDefault」関数を使用して、スクリプトがページでメッセージを受信しないようにします。
機能を保存します
しかし、これでもセキュリティを確保するには十分ではありません。
残念ながら、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){...}