私たちは何を家を建てるべきですか?
現在、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);