MODxおよびVbulletin 3.8.x-平和、友情、チューインガム

私たちは何を家を建てるべきですか?



現在、vbulletinフォーラムエンジンは多くの人に馴染みのあるものです。 誰かがそれを使用し、誰かが静かにそれを嫌い、そして誰かがライセンスを購入するために財政を上司に尋ねます。

そして、その人気のために、多くのCMSがこのエンジンをサポートしていますが、MODxでしか通常のプラグイン/スニペットを見つけられず、既存のものはそれらを使用するのに十分な生のものでした。

ご列席の皆様、愛してください:

実験は、MODxバージョン1.0.2およびvbulletinバージョン3.8.1で実施されました。



静かに行く、続ける



最初に準備する必要があり、最初はglobal.phpフォーラムファイルです。

私はこれをしました: global_modx.php (... / forum / global_modx.php)にコピーし、編集のために開いて、 891行 (リコール、フォーラムバージョン3.8.1)の後にすべてを削除しました-スタイルなどを接続します、t .e。 ファイルの最後の行では、verify_ip_ban()関数を呼び出しています。



注:グローバル接続に問題がありました-内部チェックのためにスクリプトの途中で終了(die();またはexit();)を実行したため、最初にテストバージョンですべてを実行することをお勧めします。



MODxの神聖なindex.phpファイルに、次の魔法のコード行を挿入します。



$VBDIR = "../forum/"; // , ,

$CURDIR = getcwd();

chdir($VBDIR);

require_once($VBDIR."global_modx.php");

chdir($CURDIR);







そうそう! すでにMODxはすべてのフォーラムデータを見ています! どのスニペットでも、標準の$ vbulletinオブジェクト(print_rコマンド($ vbulletin)を使用して(グローバルに宣言)使用できます。使用可能なフィールドはすべて表示できますが、非常に多くのフィールドがあり、おそらくprint_r($ vbulletin-> userinfo)のみが必要です) )



私たちは研究を続けます、紳士



次に、サイトで承認の問題を実装する必要があります。 「ロール」から標準ログインフォームをコピーするforum_login_formチャンクを作成します。



 <!-ログインフォーム->
 <form action = "[+ forumLink +] login.php?do = login" method = "post" onsubmit = "md5hash(vb_login_password、vb_login_md5password、vb_login_md5password_utf、0)">
 <script type = "text / javascript" src = "[+ forumLink +] clientscript / vbulletin_md5.js?v = 381"> </ script>
 <table cellpadding = "0" cellspacing = "3" border = "0">
    <tr>
       <td> <input type = "text" value = "Login" name = "vb_login_username" id = "navbar_username" accesskey = "u" tabindex = "101" onfocus = "javascript:if(this.defaultValue == this.value )this.value = ''; else if(this.value == '')this.value = this.defaultValue; "  onblur = "javascript:if(this.defaultValue == this.value)this.value = ''; else if(this.value == '')this.value = this.defaultValue;"  class = "input" /> </ td>
       <td> <input type = "checkbox" name = "cookieuser" value = "1" tabindex = "103" id = "cb_cookieuser_navbar" accesskey = "c" /> </ td>
       <td> <label for = "cb_cookieuser_navbar">覚えていますか</ label> </ td>
    </ tr>
    <tr>
        <td> <input type = "password" value = "Password" name = "vb_login_password" id = "navbar_password" tabindex = "102" onfocus = "javascript:if(this.defaultValue == this.value)this.value = ''; else if(this.value == '')this.value = this.defaultValue; "  onblur = "javascript:if(this.defaultValue == this.value)this.value = ''; else if(this.value == '')this.value = this.defaultValue;"  class = "input" /> </ td>
        <td> </ td>
        <td> <input type = "submit" class = "button" value = "Login" tabindex = "104" title = "ログインするにはユーザー名とパスワードを入力するか、[登録]ボタンをクリックして登録します。  accesskey = "s" /> </ td>
    </ tr>
 </ table>
 <input type = "hidden" name = "s" value = "" />
 <input type = "hidden" name = "securitytoken" value = "guest" />
 <input type = "hidden" name = "do" value = "login" />
 <input type = "hidden" name = "vb_login_md5password" />
 <input type = "hidden" name = "vb_login_md5password_utf" />
 </ form>
 <!-/ログインフォーム->


[+ forumLink +]に注意してください。管理を容易にするためにスニペットが呼び出されると、アドレスが置き換えられます。

注:いずれの場合も、このフォームはスタイルによって異なるため、フォーラムから切り取ってこのチャンクに貼り付けるのが最も便利です。



次に、ログインユーザーに表示されるforum_login_loggedチャンクを作成します。

 <strong>こんにちは<ahref="[+profile+†"style="white-space:nowrap;">[+ loginName +] </a>!  </ strong> <br />
 <ahref="[+action+†"class="button">ログアウトします。</a>


ビューを作成したUgumsは、コントローラーを作成してログインスニペットを作成します 。これは、後で標準modx WebLoginの呼び出しを置き換えます。

 <?php
グローバル$ vbulletin、$ modx;

 $ forumlink =(isset($ forumlink))?  $ forumlink: 'http:// PATH_TO_YOU_FORUM /';  //フォーラムアドレスがcall snippetパラメータで指定されていない場合、標準を使用します

 if($ vbulletin-> userinfo ['userid'] == 0){//ユーザーが認証されているかどうかを確認する
     //いいえ? ログインフォームを表示する
     echo $ modx-> parseChunk( 'forum_login_form'、array( 'forumLink' => $ forumlink)、 '[+'、 '+]');
    //ユーザーがサイトで承認されているが、フォーラムで承認されていることを確認します-いいえ。 その場合、セッションを削除します
    // todo:管理セッションに触れることなく、WEBユーザーのセッションのみを削除します
     if(!empty($ _ SESSION ['webInternalKey']))){
         session_destroy(); 
         session_unset();
     }
 }
 else {//フォーラムでユーザーが承認されている場合-modxに情報を提供します
    
     //サイトにユーザーアカウントが作成されているかどうかを確認しますか?
     $ sql = "SELECT id FROM"。$ modx-> getFullTableName( "web_users")。 "WHERE id = '"。$ vbulletin-> userinfo [' userid ']。 "'";
     $ rs = $ modx-> db-> query($ sql);
     $ limit = $ modx-> db-> getRecordCount($ rs);

     if($ limit == 0){ 
         //そのようなユーザーのmodを知らない
         //作成
         $ sql = "INSERT INTO"。$ modx-> getFullTableName( "web_users")。 "(id、username、password) 
                値( "。$ Vbulletin-> userinfo ['userid']。"、 '"。$ Vbulletin-> userinfo [' username ']。"'、Md5( 'empty')); ";
         $ rs = $ modx-> db-> query($ sql);      
        
         //ユーザー属性を保存します
         $ sql = "INSERT INTO"。$ modx-> getFullTableName( "web_user_attributes")。 "(internalKey、fullname、email、zip、state、country) 
                値( "。$ Vbulletin-> userinfo ['userid']。"、 '"。$ Vbulletin-> userinfo [' username ']。"'、 '"。$ Vbulletin-> userinfo [' email ']。"' 、 ''、 ''、 ''); ";
         $ rs = $ modx-> db-> query($ sql);
         $ sql = "INSERT INTO"。$ modx-> getFullTableName( "web_groups")。 "(webgroup、webuser) 
                値(2、 "。$ Vbulletin-> userinfo ['userid']。"); ";
         $ rs = $ modx-> db-> query($ sql);
        
         $ modx-> logEvent(998、1、 'サイトにアカウントを作成しました。'、 'サイトにアカウントを作成しました。'、 'ログインスニペット');
     }        
    
     if(!$ modx-> userLoggedIn()){//次に、ユーザーが認証されていないかどうかを確認します
         // modixセッションにフォーラムデータを入力します
         $ _SESSION ['webShortname'] = $ vbulletin-> userinfo ['username'];
         $ _SESSION ['webFullname'] = $ vbulletin-> userinfo ['username'];
         $ _SESSION ['webEmail'] = $ vbulletin-> userinfo ['email'];
         $ _SESSION ['webValidated'] = 1;
         $ _SESSION ['webInternalKey'] = $ vbulletin-> userinfo ['userid'];
         $ _SESSION ['webValid'] = base64_encode($ vbulletin-> userinfo ['password']);
         $ _SESSION ['webUser'] = base64_encode($ vbulletin-> userinfo ['username']);
         $ _SESSION ['webFailedlogins'] = 0;
         $ _SESSION ['webLastlogin'] = $ vbulletin-> userinfo ['lastactivity'];
         $ _SESSION ['webnrlogins'] = 0;
         $ _SESSION ['usertype'] = 'web'; 
         $ _SESSION ['webUserGroupNames'] = '';  //ユーザーグループ名をリセットします
          
         //大まかに言えば、ユーザーがアクセスできるドキュメントのグループを確認し、
         //そして、それらが許可されたユーザーによって変更された場合、後者は「再ログイン」する必要があります
         $ dg = '';
         $ i = 0;
         $ tblug = $ modx-> getFullTableName( "web_groups");
         $ tbluga = $ modx-> getFullTableName( "webgroup_access");
         $ sql = "SELECT uga.documentgroup
                 FROM $ tblug ug
                内部結合$ tbluga uga ON uga.webgroup = ug.webgroup
                 WHERE ug.webuser = "。$ Vbulletin-> userinfo ['userid'];
         $ ds = $ modx-> db-> query($ sql);
         while($ row = $ modx-> db-> getRow($ ds、 'num'))$ dg [$ i ++] = $ row [0];
         $ _SESSION ['webDocgroups'] = $ dg;
     }
     //終了フォームを解析します
     echo $ modx-> parseChunk( 'forum_login_logged'、 
             array( 'action' => $ forumlink.'login.php?do = logout&logouthash = '。$ vbulletin-> userinfo [' securitytoken ']、
                   'profile' => $ forumlink.'usercp.php '、
                   'loginName' => $ vbulletin-> userinfo ['username'])、
             '[+'、
             '+]'
          );
  
     //ユーザーアクティビティを記録するパート
     if(getenv( "HTTP_CLIENT_IP"))$ ip = getenv( "HTTP_CLIENT_IP");
     else if(getenv( "HTTP_X_FORWARDED_FOR"))$ ip = getenv( "HTTP_X_FORWARDED_FOR");
     else if(getenv( "REMOTE_ADDR"))$ ip = getenv( "REMOTE_ADDR");
     else $ ip = "UNKNOWN"; $ _ SESSION ['ip'] = $ ip;

     $ itemid = isset($ _ REQUEST ['id'])?  $ _REQUEST ['id']: 'NULL'; $ lasthittime = time(); $ a = 998;
    
     $ sql = "REPLACE INTO"。$ modx-> getFullTableName( "active_users")。 "(internalKey、username、lasthit、action、id、ip)値(-"。$ _ SESSION ['webInternalKey']。 "、 '" 。$ _ SESSION ['webShortname']。 "'、'"。$ Lasthittime。 "'、'"。$ A. "'、"。$ Itemid。 "、' $ Ip ')";
     $ rs = $ modx-> db-> query($ sql);
 }
 ?> 


コードは十分にコメントされているので、質問はありません。 デバッグのための習慣と利便性から、(db-> select、db-> insertではなく)個別にリクエストを行いました。



少しだけ幸福感を完成させる



上記のすべてを実行すると、次のことができます。





そして、このバンを実装するために、ウェブサイトのテンプレートでスニペットコール[[login]]を規定し、その後は作業を楽しむだけです。 このアプローチのマイナス点:フォーラムのユーザーがサイトにアクセスするまで、もちろんそのユーザーのデータベースにペンを作成しない限り、ページへのアクセス権を制限することは不可能です。



開発が開始され、フォーラムのindex.phpにグローバルファイルの導入のみが残されたBanzaiTokyoメソッドとは異なり、フォーラムと登録の終了を制御するための製品とモジュールを作成する必要はありません。すべてがサイトで直接自動的に行われます。



2010年7月28日UPD:

サイトでこのソリューションを使用したプログラマー! 注意! blind-SQLの実行を許可する脆弱性があります。

$ itemid = isset($ _ REQUEST ['id'])? $ _REQUEST ['id']: 'NULL'; $ lasthittime = time(); $ a = 998;

$ sql = "REPLACE INTO"。$ modx-> getFullTableName( "active_users")。 "(internalKey、username、lasthit、action、id、ip)値(-"。$ _ SESSION ['webInternalKey']。 "、 '" 。$ _ SESSION ['webShortname']。 "'、'"。$ Lasthittime。 "'、'"。$ A. "'、"。$ Itemid。 "、' $ Ip ')";

$ rs = $ modx-> db-> query($ sql);



特定のサブクエリをidに代入すると、比較操作を実行して、データを簡単にブルートフォースできます。 残念ながら、彼らはこの脆弱性によって私をハッキングしました((私は単純に:

$ itemid = isset($ _ REQUEST ['id'])? (is_numeric($ _ REQUEST ['id'])?$ _ REQUEST ['id']: 'NULL') : 'NULL'; $ lasthittime = time(); $ a = 998;

$ sql = "REPLACE INTO"。$ modx-> getFullTableName( "active_users")。 "(internalKey、username、lasthit、action、id、ip)値(-"。$ _ SESSION ['webInternalKey']。 "、 '" 。$ _ SESSION ['webShortname']。 "'、'"。$ Lasthittime。 "'、'"。$ A. "'、"。$ Itemid。 "、' $ Ip ')";

$ rs = $ modx-> db-> query($ sql);




All Articles