Board logo

標題: [xoops2] 自動登入以及郵件登入的HACK [打印本頁]

作者: kayin    時間: 2004-11-5 03:55 PM     標題: [xoops2] 自動登入以及郵件登入的HACK

轉載自  Chia浪游者之Xchange

自動登入(autologin)以及電子郵件自動辨識是一個HACK,
需要修改XOOPS原檔案來達到這些功能的目的。
原本直接製作替代檔案即可,不過因為修改的檔案牽連不小,
所以製作此說明文件讓大家自己動手做做看囉!

本說明文件由 http://www.cyai.net/ 阿佳(Chia)所製作,
任何人都可以自由傳閱或轉載這份說明文件(不需另外通知),
但是請尊重文件製作的辛勞,
不要任意私自修改本文件裡的內容。
如果轉載,也希望能夠有原製作者的說明文字。
任何的HACK都會有風險,請自己評估後再確定是否要製作!
本人也僅是以個人經驗加上日本原始檔案所做出來的這份文件,
並不保證適用於每個人的網站。也不對發生的任何錯誤負責!
請確實先做好備份工作,以免造成不必要的損失。

以下修改方式跟最下方說明內容是由
日本原作者GIJOE (http://www.peak.ne.jp/)
所提供的檔案去找的資訊,適用於 『XOOPS2.0.7』
該作者網站或是XOOPS總站皆有提供原始檔案的完成檔下載,
不過由於是HACK,所以不適合HACK過XOOPS者使用。
而XOOPS其他版本請參考原作者網站或XOOPS總站所提供的其他版本文件去做修改。

以下說明都有標示原檔案的行數,
該行數值是以中文官方支援站所提供的twxoops207_20040701版本為例算出,
如果是其它版本或是曾經HACK過者,請將該行數當作參考即可。

XOOPS2.0.7 繁體中文版本為例,需要修改的原檔案(有七項):
(XOOPS根目錄下)
user.php
include/checklogin.php
include/common.php
language/tchinese/global.php
modules/system/blocks/system_blocks.php
modules/system/templates/system_userform.html
modules/system/templates/blocks/system_block_login.html

HACK方式:
(一) 修改 user.php

[code:333a51fa5e]找到大約第51行
        $xoopsTpl->assign('lang_password', _PASSWORD);
        下面加入
//-----------------------------------------------
$xoopsTpl->assign('lang_rememberme', _REMEMBERME);
//-----------------------------------------------

找到有四行註解掉的內容,大約第78行
        //setcookie('autologin_pass', '', time() - 3600, '/', '', 0);
下面加入
//-----------------------------------------------
        $xoops_cookie_path = defined('XOOPS_COOKIE_PATH') ? XOOPS_COOKIE_PATH : preg_replace( '?http://[^/]+(/.*)$?' , "$1" , XOOPS_URL ) ;
        if( $xoops_cookie_path == XOOPS_URL ) $xoops_cookie_path = '/' ;
        setcookie('autologin_uname', '', time() - 3600, $xoops_cookie_path, '', 0);
        setcookie('autologin_pass', '', time() - 3600, $xoops_cookie_path, '', 0);
        setcookie('autologin_uname', '', time() - 3600, '/', '', 0);
        setcookie('autologin_pass', '', time() - 3600, '/', '', 0);
//-----------------------------------------------

user.php修改完畢,存檔![/code:333a51fa5e]

(二) 修改 include/checklogin.php

[code:333a51fa5e]找到大約第44行
        $user =& $member_handler->loginUser(addslashes($myts->stripSlashesGPC($uname)), addslashes($myts->stripSlashesGPC($pass)));
將這行註解或是刪除後下面加入
//-----------------------------------------------
        $uname4sql = addslashes( $myts->stripSlashesGPC($uname) ) ;
        $pass4sql = addslashes( $myts->stripSlashesGPC($pass) ) ;
        if( strstr( $uname , '@' ) ) {
        // check by email if uname includes '@'
        $criteria = new CriteriaCompo(new Criteria('email', $uname4sql ));
        $criteria->add(new Criteria('pass', md5( $pass4sql )));
        $user_handler =& xoops_gethandler('user');
        $users =& $user_handler->getObjects($criteria, false);
        if( empty( $users ) || count( $users ) != 1 ) $user = false ;
        else $user = $users[0] ;
        unset( $users ) ;
        }
        if( empty( $user ) || ! is_object( $user ) ) {
                $user =& $member_handler->loginUser($uname4sql,$pass4sql);
        }
//-----------------------------------------------
找到大約第85行
                $url = XOOPS_URL.'/index.php';
        }

下面加入
//-----------------------------------------------
        $xoops_cookie_path = defined('XOOPS_COOKIE_PATH') ? XOOPS_COOKIE_PATH : preg_replace( '?http://[^/]+(/.*)$?' , "$1" , XOOPS_URL ) ;
        if( $xoops_cookie_path == XOOPS_URL ) $xoops_cookie_path = '/' ;
        if (!empty($HTTP_POST_VARS['rememberme'])) {
                $expire = time() + $xoopsConfig['session_expire'] * 60;
                setcookie('autologin_uname', $user->getVar('uname'), $expire, $xoops_cookie_path, '', 0);
                setcookie('autologin_pass', $user->getVar('pass'), $expire, $xoops_cookie_path, '', 0);
        }
//-----------------------------------------------

include/checklogin.php 修改完畢,存檔![/code:333a51fa5e]

(三) 修改 include/common.php

[code:333a51fa5e]首先找到裡面有一大串被註解的//autologin描述,大約在第181行~204行如下:
        //autologin
        //if(empty($HTTP_SESSION_VARS['xoopsUserId']) && isset($HTTP_COOKIE_VARS['autologin_uname']) && isset($HTTP_COOKIE_VARS['autologin_pass'])) {
        //        $myts =& MyTextSanitizer::getInstance();
        //        $uname = $myts->stripSlashesGPC($HTTP_COOKIE_VARS['autologin_uname']);
        //        $pass = $myts->stripSlashesGPC($HTTP_COOKIE_VARS['autologin_pass']);
        //        $myts =& MyTextsanitizer::getInstance();
        //        $user =& $member_handler->loginUserMd5(addslashes($uname), addslashes($pass));
        //        if (false != $user && $user->getVar('level') > 0) {
                        // update time of last login
        //                $user->setVar('last_login', time());
        //                if (!$member_handler->insertUser($user, true)) {
        //                }
                        //$HTTP_SESSION_VARS = array();
        //                $HTTP_SESSION_VARS['xoopsUserId'] = $user->getVar('uid');
        //                $HTTP_SESSION_VARS['xoopsUserGroups'] = $user->getGroups();
                        // update autologin cookies
        //                $expire = time() + $xoopsConfig['session_expire'] * 60 ;
        //                setcookie('autologin_uname', $uname, $expire, '/', '', 0);
        //                setcookie('autologin_pass', $pass, $expire, '/', '', 0);
        //        } else {
        //                setcookie('autologin_uname', '', time() - 3600, '/', '', 0);
        //                setcookie('autologin_pass', '', time() - 3600, '/', '', 0);
        //        }
        //}

在這之後加上以下這段描述:
//-----------------------------------------------
        if(empty($HTTP_SESSION_VARS['xoopsUserId']) && isset($HTTP_COOKIE_VARS['autologin_uname']) && isset($HTTP_COOKIE_VARS['autologin_pass'])) {

                // redirect to XOOPS_URL/ when query string exists (anti-CSRF)
                if( ! empty( $HTTP_SERVER_VARS['QUERY_STRING'] ) ) {
                        redirect_header( XOOPS_URL . '/' , 0 , 'Now, logging in automatically' ) ;
                        exit ;
                }

                $myts =& MyTextSanitizer::getInstance();
                $uname = $myts->stripSlashesGPC($HTTP_COOKIE_VARS['autologin_uname']);
                $pass = $myts->stripSlashesGPC($HTTP_COOKIE_VARS['autologin_pass']);
                $user =& $member_handler->loginUserMd5(addslashes($uname), addslashes($pass));
                $xoops_cookie_path = defined('XOOPS_COOKIE_PATH') ? XOOPS_COOKIE_PATH : preg_replace( '?http://[^/]+(/.*)$?' , "$1" , XOOPS_URL ) ;
                if( $xoops_cookie_path == XOOPS_URL ) $xoops_cookie_path = '/' ;
                if (false != $user && $user->getVar('level') > 0) {
                        // update time of last login
                        $user->setVar('last_login', time());
                        if (!$member_handler->insertUser($user, true)) {
                        }
                        //$HTTP_SESSION_VARS = array();
                        $HTTP_SESSION_VARS['xoopsUserId'] = $user->getVar('uid');
                        $HTTP_SESSION_VARS['xoopsUserGroups'] = $user->getGroups();
                        // update autologin cookies
                        $expire = time() + $xoopsConfig['session_expire'] * 60 ;
                        setcookie('autologin_uname', $uname, $expire, $xoops_cookie_path, '', 0);
                        setcookie('autologin_pass', $pass, $expire, $xoops_cookie_path, '', 0);
                } else {
                        setcookie('autologin_uname', '', time() - 3600, $xoops_cookie_path, '', 0);
                        setcookie('autologin_pass', '', time() - 3600, $xoops_cookie_path, '', 0);
                }
        }
//-----------------------------------------------

include/common.php 修改完畢,存檔![/code:333a51fa5e]

(四) 修改 language/tchinese/global.php

[code:333a51fa5e]敘述自動登入的語文,找適當的地方加入
(建議可以加在// Module info的下面這群語言裡)
//-----------------------------------------------
define('_REMEMBERME','自動登入');
//-----------------------------------------------

language/tchinese/global.php 修改完畢,存檔![/code:333a51fa5e]

(五) 修改 modules/system/blocks/system_blocks.php

[code:333a51fa5e]找到大約第95行 $block['lang_password'] = _PASSWORD;
下面加入一行
//-----------------------------------------------
$block['lang_rememberme'] = _REMEMBERME; // autologin hack
//-----------------------------------------------

modules/system/blocks/system_blocks.php 修改完畢,存檔!

基本上修改到這裡就已經具備了自動登入以及電子郵件登入的功能了!
喝杯茶,休息一下!再來修改兩個登入樣板,
讓您的登入區塊會出現一個自動登入的勾取選項表單。[/code:333a51fa5e]

(六) 修改 modules/system/templates/system_userform.html

[code:333a51fa5e]找到大約第五行
<{$lang_password}> <input type="password" name="pass" size="21" maxlength="32" /><br />
下面插入(新增一行)
<input type="checkbox" name="rememberme" value="On" /><{$lang_rememberme}><br />

當然,您也可以自己加入在你認為適合的地方。
modules/system/blocks/system_blocks.php 修改完畢,存檔![/code:333a51fa5e]

(七) 修改 modules/system/templates/blocks/system_block_login.html

[code:333a51fa5e]其實在XOOPS2.0.7裡面(其他版本未確認)早已有自動登入的語法,
不過這段描述被註解起來了!所以只要將其註解給取消即可。
如果您的system_block_login.html沒有這部份的語法,
那就在適當的地方加入下述語法即可。
<input type="checkbox" name="rememberme" value="On" class ="formButton" /><{$block.lang_rememberme}> <br />[/code:333a51fa5e]

恭喜您,已經大告功成了!
最後一個步驟就是到後台更新您的『系統管理區』模組。

如果成功了,這時如果您在帳號欄位輸入『帳號』或是『註冊時的電子郵件』
再加上密碼就能夠正常登入。
自動登入的原理是在session的有效期間內保存一份COOKIE在使用端電腦裡,
裡面包含登入帳號跟密碼等資訊,
所以絕對有可能會被有心人士盜取的機會,
建議在登入適當的地方做些簡單的說明,
儘量避免使用端在非私人電腦上(例如學校電腦之類的)執行自動登入功能。
而雖然利用了session的有效期間,
但是如果『訂製session』如果開啟的話(customize session),
可能會導致自動登入無法正常執行!
而這個自動登入的HACK僅是利用了該有效期間的設定而已,
一般來說建議設定在一星期(10080)到一個月(43200)之間最佳。




歡迎光臨 Kuroshio Ocean Design - 黑潮設計 (http://forum.kod.tw/) Powered by Discuz! 7.2