有名なUserJSの使用を禁止します

はじめに



UserJSは、Webページを変更するための便利でシンプルなメカニズムをユーザーに提供します。これが、多くのユーザーがUserJSでアクションを自動化し、時には脆弱なセキュリティシステムをバイパスする理由です。

何よりも、ブラウザベースのオンラインゲームはUserJSを使用しているユーザーに苦しんでおり、その多くは既にUserJSとの戦いを始めています。 たとえば、トラビアンゲームは通常のフォームと一緒に表示されることがある偽の非表示のWebフォームを使用します。この機能を考慮せずに記述されたUserJSスクリプトは誤っており、偽のフォームを介してデータを送信します。

よく知られているUserJSスクリプトでのみ戦うことができます。示されている解決策は普遍的ではなく、スクリプトから保護することはできません。

今日、私はあなたの裁判所にユーザースクリプトを扱う私の方法を提示しています-MD5ハッシュとそれに続く比較。 主な演技の役割は、JavaScriptとPHPが果たします。



凡例



単純な認証フォームを備えたWebサイトがあるが、ユーザーはログインの入力に慣れていないが、フォームに追加のボタンを追加するUserJSスクリプトを使用すると、クリックするとログインが自動的に入力されます。 この例はわかりやすくするためのものです。承認フォームの代わりに、たとえば、オンライン戦略で部隊を送信するためのフォームがあり、UserJSスクリプトは部隊を自動的に送信するボットです。



ソースデータ



したがって、フォームは次のようになります。





ユーザーはOperaブラウザで次のUserJSを使用します。

Copy Source | Copy HTML window.opera.addEventListener( 'AfterEvent.load' , function (e){ if (e. event .target instanceof Document){ e.preventDefault(); document.forms[ 0 ].innerHTML+= '<input type="button" onclick="document.forms[0].login.value=\'Login\';" value="AutoLogin">' ; } }, false );



  1. Copy Source | Copy HTML window.opera.addEventListener( 'AfterEvent.load' , function (e){ if (e. event .target instanceof Document){ e.preventDefault(); document.forms[ 0 ].innerHTML+= '<input type="button" onclick="document.forms[0].login.value=\'Login\';" value="AutoLogin">' ; } }, false );



  2. Copy Source | Copy HTML window.opera.addEventListener( 'AfterEvent.load' , function (e){ if (e. event .target instanceof Document){ e.preventDefault(); document.forms[ 0 ].innerHTML+= '<input type="button" onclick="document.forms[0].login.value=\'Login\';" value="AutoLogin">' ; } }, false );



  3. Copy Source | Copy HTML window.opera.addEventListener( 'AfterEvent.load' , function (e){ if (e. event .target instanceof Document){ e.preventDefault(); document.forms[ 0 ].innerHTML+= '<input type="button" onclick="document.forms[0].login.value=\'Login\';" value="AutoLogin">' ; } }, false );



  4. Copy Source | Copy HTML window.opera.addEventListener( 'AfterEvent.load' , function (e){ if (e. event .target instanceof Document){ e.preventDefault(); document.forms[ 0 ].innerHTML+= '<input type="button" onclick="document.forms[0].login.value=\'Login\';" value="AutoLogin">' ; } }, false );



  5. Copy Source | Copy HTML window.opera.addEventListener( 'AfterEvent.load' , function (e){ if (e. event .target instanceof Document){ e.preventDefault(); document.forms[ 0 ].innerHTML+= '<input type="button" onclick="document.forms[0].login.value=\'Login\';" value="AutoLogin">' ; } }, false );



  6. Copy Source | Copy HTML window.opera.addEventListener( 'AfterEvent.load' , function (e){ if (e. event .target instanceof Document){ e.preventDefault(); document.forms[ 0 ].innerHTML+= '<input type="button" onclick="document.forms[0].login.value=\'Login\';" value="AutoLogin">' ; } }, false );







またはFireFoxでGreaceMonkey拡張機能の場合:

Copy Source | Copy HTML // ==UserScript== // @name test1 // @namespace test // @include http://localhost/anti-userjs/test1.php // ==/UserScript== document.forms[ 0 ].innerHTML+= '<input type="button" onclick="document.forms[0].login.value=\'Login\';" value="AutoLogin">' ;



  1. Copy Source | Copy HTML // ==UserScript== // @name test1 // @namespace test // @include http://localhost/anti-userjs/test1.php // ==/UserScript== document.forms[ 0 ].innerHTML+= '<input type="button" onclick="document.forms[0].login.value=\'Login\';" value="AutoLogin">' ;



  2. Copy Source | Copy HTML // ==UserScript== // @name test1 // @namespace test // @include http://localhost/anti-userjs/test1.php // ==/UserScript== document.forms[ 0 ].innerHTML+= '<input type="button" onclick="document.forms[0].login.value=\'Login\';" value="AutoLogin">' ;



  3. Copy Source | Copy HTML // ==UserScript== // @name test1 // @namespace test // @include http://localhost/anti-userjs/test1.php // ==/UserScript== document.forms[ 0 ].innerHTML+= '<input type="button" onclick="document.forms[0].login.value=\'Login\';" value="AutoLogin">' ;



  4. Copy Source | Copy HTML // ==UserScript== // @name test1 // @namespace test // @include http://localhost/anti-userjs/test1.php // ==/UserScript== document.forms[ 0 ].innerHTML+= '<input type="button" onclick="document.forms[0].login.value=\'Login\';" value="AutoLogin">' ;



  5. Copy Source | Copy HTML // ==UserScript== // @name test1 // @namespace test // @include http://localhost/anti-userjs/test1.php // ==/UserScript== document.forms[ 0 ].innerHTML+= '<input type="button" onclick="document.forms[0].login.value=\'Login\';" value="AutoLogin">' ;



  6. Copy Source | Copy HTML // ==UserScript== // @name test1 // @namespace test // @include http://localhost/anti-userjs/test1.php // ==/UserScript== document.forms[ 0 ].innerHTML+= '<input type="button" onclick="document.forms[0].login.value=\'Login\';" value="AutoLogin">' ;







このスクリプトを有効にすると、ユーザーは次の種類の認証フォームを受け取ります。





ソースからわかるように、「AutoLogin」ボタンを押すと、「login」フィールドに入力します。

ユーザーによるこのスクリプトの使用を禁止してみましょう。



承認フォームの出力



PHPファイルから承認フォームを表示し、フォームをdivタグでフレーム化し、PHPツールを使用してこのタグ内のすべてのデータをキャッシュします。 ハッシュは、後続の制御のためにセッションに保存されます。

Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  1. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  2. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  3. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  4. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  5. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  6. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  7. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  8. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  9. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  10. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  11. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  12. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  13. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  14. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  15. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  16. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  17. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>



  18. Copy Source | Copy HTML <div id= "main" > <? ob_start(); ?> <form method= "POST" > : <input name= "login" type= "text" ><br> : <input name= "password" type= "password" ><br> <input name= "md5" type= "hidden" ><br> <input value= "" type= "submit" > </form> <? $data =ob_get_contents(); ob_end_flush(); $data =strtr( $data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); $data =preg_replace( "/[ \t\n\r]/" , '' , $data ); $md5 =md5( $data ); $_SESSION [ 'md5' ]= $md5 ; ?> </div>







コンテンツの処理に関するいくつかの言葉-OperaブラウザーとFireFoxブラウザーは独自の方法でHTMLコードを焼き付けるため、JavaScriptで処理すると異なる結果になります。 そのため、OperaはすべてのHTMLタグを大文字に変換し、FireFoxは標準に従ってタグのパラメーターを変更します。 したがって、制御されたHTMLコードを有効に記述することが重要です。

さまざまなタグレジスタ処理と改行を排除するために、すべてのスペース、タブ、および改行がコンテンツから削除され、すべての英語の文字が小文字になります。

もう1つの重要な注意事項-ドキュメントのエンコーディングはUTF-8である必要があります。ブラウザでのCP1251 JavaScriptとPHPの動作は異なります。



JavaScriptコントロール



そのため、フォームが推測され、そのチェックサムがカウントされました。ユーザーの側で計算し、UserJSの介入がないことを確認する必要があります。 これを行うには、onLoadにイベントを追加し、JS関数を呼び出します。

Copy Source | Copy HTML > function checkuserjs(){ var data=document.getElementsByTagName( 'div' )[ 0 ].innerHTML; data=strtr(data, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); data=data.replace(/[ \t\n\r]/g, '' ); document.forms[ 0 ].md5.value=md5(data); }







  1. Copy Source | Copy HTML > function checkuserjs(){ var data=document.getElementsByTagName( 'div' )[ 0 ].innerHTML; data=strtr(data, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); data=data.replace(/[ \t\n\r]/g, '' ); document.forms[ 0 ].md5.value=md5(data); }







  2. Copy Source | Copy HTML > function checkuserjs(){ var data=document.getElementsByTagName( 'div' )[ 0 ].innerHTML; data=strtr(data, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); data=data.replace(/[ \t\n\r]/g, '' ); document.forms[ 0 ].md5.value=md5(data); }







  3. Copy Source | Copy HTML > function checkuserjs(){ var data=document.getElementsByTagName( 'div' )[ 0 ].innerHTML; data=strtr(data, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); data=data.replace(/[ \t\n\r]/g, '' ); document.forms[ 0 ].md5.value=md5(data); }







  4. Copy Source | Copy HTML > function checkuserjs(){ var data=document.getElementsByTagName( 'div' )[ 0 ].innerHTML; data=strtr(data, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); data=data.replace(/[ \t\n\r]/g, '' ); document.forms[ 0 ].md5.value=md5(data); }







  5. Copy Source | Copy HTML > function checkuserjs(){ var data=document.getElementsByTagName( 'div' )[ 0 ].innerHTML; data=strtr(data, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); data=data.replace(/[ \t\n\r]/g, '' ); document.forms[ 0 ].md5.value=md5(data); }







  6. Copy Source | Copy HTML > function checkuserjs(){ var data=document.getElementsByTagName( 'div' )[ 0 ].innerHTML; data=strtr(data, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); data=data.replace(/[ \t\n\r]/g, '' ); document.forms[ 0 ].md5.value=md5(data); }







  7. Copy Source | Copy HTML > function checkuserjs(){ var data=document.getElementsByTagName( 'div' )[ 0 ].innerHTML; data=strtr(data, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); data=data.replace(/[ \t\n\r]/g, '' ); document.forms[ 0 ].md5.value=md5(data); }







Copy Source | Copy HTML > function checkuserjs(){ var data=document.getElementsByTagName( 'div' )[ 0 ].innerHTML; data=strtr(data, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' , 'abcdefghijklmnopqrstuvwxyz' ); data=data.replace(/[ \t\n\r]/g, '' ); document.forms[ 0 ].md5.value=md5(data); }











その中で、いくつかの既製の関数を使用しました-md5とstrtr、記事ではそれらをアップロードしません。添付ファイルでそれらを見つけることができます。

ユーザー側のJavaスクリプトは、上記のPHPスクリプトと同じアクションを実行し、結果(コンテンツのハッシュ)がフォームに入力されます。



サーバー側の処理



問題は小さいままです-受信したデータを確認してください:

Copy Source | Copy HTML if ( $_POST ){ if ( $_POST [ 'md5' ]!= $_SESSION [ 'md5' ]) die ( ' UserJS !' ); echo ' ' ; }



  1. Copy Source | Copy HTML if ( $_POST ){ if ( $_POST [ 'md5' ]!= $_SESSION [ 'md5' ]) die ( ' UserJS !' ); echo ' ' ; }



  2. Copy Source | Copy HTML if ( $_POST ){ if ( $_POST [ 'md5' ]!= $_SESSION [ 'md5' ]) die ( ' UserJS !' ); echo ' ' ; }



  3. Copy Source | Copy HTML if ( $_POST ){ if ( $_POST [ 'md5' ]!= $_SESSION [ 'md5' ]) die ( ' UserJS !' ); echo ' ' ; }



  4. Copy Source | Copy HTML if ( $_POST ){ if ( $_POST [ 'md5' ]!= $_SESSION [ 'md5' ]) die ( ' UserJS !' ); echo ' ' ; }



  5. Copy Source | Copy HTML if ( $_POST ){ if ( $_POST [ 'md5' ]!= $_SESSION [ 'md5' ]) die ( ' UserJS !' ); echo ' ' ; }







したがって、不正なユーザーを検出します(GreaseMonkeyインジケーターに注意してください)。





おわりに



私が示した例は、UserJSの使用を禁止するまさにそのアプローチを示しています。それに基づいたソリューションを開発する場合、要点を理解する必要があります-UserJSの使用を禁止することはできないため、サイトに影響するレイアウトされたスクリプトを監視し、それらからの保護を開発する必要があります。 このようなスクリプトは熱意を持って作成されているため、防御が回避された場合、新しいバージョンのスクリプトがリリースされてもすぐにはリリースされない可能性が高くなります。 同じトラビアンがこれを実証しています-偽フォームによる最も簡単な保護は半年前に導入されましたが、UserJSスクリプトの新しいバージョンはまだありません。



アプリケーション: anti-userjs.tar.gz 3708バイト



All Articles