私たちは何を家を建てるべきですか?
現在、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ではなく)個別にリクエストを行いました。
少しだけ幸福感を完成させる
上記のすべてを実行すると、次のことができます。
- フォーラムでの単一承認-入場と退場
- サイトの任意のページのフォーラムデータへのアクセス
- サイトまたはフォーラムにログインすることで、どこでも認証が機能します(表示しているページにリダイレクトされます)
- MODhユーザーの作成、つまり また、ユーザーを認識します。これにより、ドキュメントなどへのアクセスを制限できます。
- サイト/フォーラムで同じユーザーID
- フォーラムに承認がない場合、サイトの承認セッションの破棄
そして、このバンを実装するために、ウェブサイトのテンプレートでスニペットコール[[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);