2003년 1월 8일 이후 
모두 명  오늘 명 
메인 페이지  
칼럼 보기  
카툰 보기  
게시판 가기  
사이트맵  
그밖의 것들  

가입하면 정말 편합니다;;
리디 스타일
랜덤배너 북마크
펌 전용 이모테이퍼
 

The others
리디폭스닷컴 빌딩맵
리디폭스닷컴을 만들때 사용된 각종 소스를 모았습니다.
질문은 질답게시판에서만 받습니다.

 PHP 5 이상으로 이전시 로그인 안되는 문제  
 리디  posted at 2018-06-10 00:36:23
234 hits  0 comments
 http://reedyfox.com NeWin reedyfox is level 39  llllllllll 
 퍼머링크 : http://reedyfox.com/island.php/building/89  [복사]

Mysql 4.1 버전에서 제로보드 호환에 문제가 되는 이유

1. PASSWORD 함수의 사용바이트 수 증가
기존 4.0 까지의 password() 함수는 함호화를 위해 16 바이트를
사용했는데 4.1 부터는 41 바이트를 사용합니다.
그리고 4.1 에서 4.0 이전의 16 바이트 함수는 old_password() 라는
이름으로 바뀌었습니다.

아래는 4.1 에서의 간단한 예입니다.

mysql> select password('aabbcc');
+-------------------------------------------+
| password('aabbcc') |
+-------------------------------------------+
| *2413A83E64BC8C0B97D3072004D15A19E48A1C00 |
+-------------------------------------------+
1 row in set (0.00 sec)

mysql> select old_password('aabbcc');
+------------------------+
| old_password('aabbcc') |
+------------------------+
| 2cbf598202278785 |
+------------------------+
1 row in set (0.00 sec)

mysql> select length(password('aabbcc'));
+----------------------------+
| length(password('aabbcc')) |
+----------------------------+
| 41 |
+----------------------------+
1 row in set (0.00 sec)

mysql> select length(old_password('aabbcc'));
+--------------------------------+
| length(old_password('aabbcc')) |
+--------------------------------+
| 16 |
+--------------------------------+
1 row in set (0.00 sec)



2. 테이블 생성 스키마 제한

제로보드에서 새 테이블을 생성할때 소스 디렉토리의 schema.sql 이라는 파일을
통해서 생성합니다.
Mysql 4.1 에서는 create table 에서

create table $admin_table (
no int(11) default '0' not null auto_increment primary key,
group_no int(20) unsigned not null,
....

와 같이 auto_increment 옵션을 준 칼럼에 default '0' 과 같은
디폴트 값을 같이 사용할 수가 없습니다.

그렇게 사용하면 아래 처럼 에러가 납니다. 당연히 제로보드에서
테이블 생성이 안됩니다.


mysql> create table aaaa ( id int default '0' not null auto_increment primary key );
ERROR 1067 (42000): Invalid default value for 'id'

mysql> create table aaaa ( id int not null auto_increment primary key );
Query OK, 0 rows affected (0.01 sec)




위 두가지만 잘 이해하면 Mysql 4.1 에서 제로보드 사용시 발생하는 에러들의 원인을
찾을 수가 있습니다.
좀더 구체적으로 보면..


[무조건 해야하는 작업]

제로보드를 처음으로 설치해서 사용하든 이전 제로보드데이타와 소스를 옮기든지
반드시 무조건 해야하는 작업은 schema.sql 이라는 파일에서
default '0' not null auto_increment 이부분에서 default '0' 을 삭제합니다.
모든 default '0'을 삭제하는 것이 아니라 반드시 auto_increment 와 같이 사용되는
칼럼의 default '0' 을 삭제합니다.

그리고 패스워드 저장하는 칼럼의 크기도 이전 20 에서 41 로 늘려주는 것이
좋습니다. 아래에서 다시..










[ 4.1 버전의 새 password() 함수를 사용할 경우]

최초로 제로보드를 깔아서 사용하려는 사람들에게 적용될 듯합니다.
좀더 보안이 강화된 4.1 버전의 password 함수를 사용하려면 php 소스는
그대로 두고 schema.sql 파일을 추가 수정해야 합니다.

위에서는 schema.sql 의 default '0' 부분만 수정했는데
이번에는 password 를 저장하는 칼럼의 크기를 늘려야 합니다.

기존의 password 칼럼은 20 혹은 18 등의 크기로 되어 있는데

password char(20)

이부분을 41 로 수정해 줍니다.
schema.sql 에서

29 라인의 password char(20) not null,
38 라인의 jumin char(18),
234 라인의 password char(20),
288 라인의 password char(20),


모두 4 곳을 41 로 크기를 수정해 줍니다.
제로보드에서는 주민등록번호도 암호화를 하므로 jumin 칼럼도
수정해 줘야 합니다. 이 외에도 빠진부분이 있는지는 각자 알아서
체크해보시길.

이와 같은 작업은 실제 설치를 시작하게 전에 해줘야 합니다.
수정하지 않고 설치후 에러가 났을 경우에는 생성된 DB 를
삭제해주고 config.php 파일을 삭제한후 다시 install.php 를
실행해서 첨부터 다시 설치를 하시면 됩니다.




[이전 4.0 이하 버전의 password() 함수를 그대로 사용할 경우]

4.0 이전의 password()함수는 mysql 4.1x 에서는 old_password() 라는
함수로 사용할 수 있습니다.
이미 mysql 4.0 이하버전에 제로보드로 많은 회원과 게시판들을 운영하고
있었던 경우 그 데이타를 그대로 살리면서 4.1로 옮길때 적용할 수 있습니다.

우선 제로보드의 php 소스에서 사용된 모든 password() 함수를 old_password() 함수로
고치면 됩니다. 말이 쉽지 작업하기 장난 아닙니다.
일단 어떤 소스에서 password() 함수를 쓰는지 보려면..

[root@haansoft bbs]# pwd
/var/www/html/bbs
[root@haansoft bbs]# grep -R -i -l "password(" ./*
./admin/admin_exec_member.php
./admin/admin_view_member.php
./comment_ok.php
./del_comment_ok.php
./delete_ok.php
./install2_ok.php
./login_check.php
./lostid_search.php
./member_join_ok.php
./member_modify_ok.php
./member_out.php
./view.php
./write_ok.php
[root@haansoft bbs]#

와 같은 파일들이 password() 함수를 씁니다. 구체적인 라인의 내용을 보려면
grep -R -i "password(" ./* 와 같이 -l 옵션을 빼고 grep 명령을
내려보면 됩니다.
위 13 개 파일을 열어서 password("$password") 와 같은 부분을
old_password("$password") 와 같이 수정해 주면 됩니다.

출처 : http://kasua.namoweb.net/zb41pl4/bbs/skin/ggambo7002_board/print.php?id=home&no=102새창으로 열기




오늘 우연하게(?) 봄이 받고 있는 호스팅 업체에 제로보드를 설치해 주다가 수정한 것입니다.

환경은
PHP : 5.x
MySQL : 5.x
이렇습니다.

현상은 다음과 같습니다
admin.php 페이지에서 로그인 id/pw 정상적으로 입력을 했음에도 불구하고 admin-setup.php로 넘어가지 않는 것입니다.

먼저 login_check.php 파일을 열어 봅니다.

session_register("zb_logged_no");
session_register("zb_logged_time");
session_register("zb_logged_ip");
session_register("zb_last_connect_check");
이런 게 있습니다.

혹시나 해서
print_r($_SESSION);
을 했더니 빈값입니다.

우선은 login_check.php 파일부터 손을 잠깐 보겠습니다.
위에 저 부분을

$_SESSION["zb_logged_no"] = $zb_logged_no;
$_SESSION["zb_logged_time"] = $zb_logged_time;
$_SESSION["zb_logged_ip"] = $zb_logged_ip;
$_SESSION["zb_last_connect_check"]= $zb_last_connect_check;
이렇게 바꿉니다.
print_r($_SESSION);
을 하게 되면

Array
(
    [zb_last_connect_check] => 0
    [zb_logged_no] => 1
    [zb_logged_time] => 1229406938
    [zb_logged_ip] => xxx.xxx.xxx.xxx <- 이거는 자체 필터링;; 쿨럭
)

이렇게 나오네요.

php.ini에 보면 register_globals라는 항목이 있는데 Off로 되어 있기 때문에 그렇습니다.
우리나라의 경우는 어지간한 호스팅 업체는 On입니다.
보안이나 이런 것들을 위해서도 Off로 사용하시는 게 좋습니다.
자 이제 됐으니 다시 로그인을 해 봅니다.
또 아까와 같은 상황입니다.

세션은 정상적으로 생성이 되었습니다.

혹시나 해서 admin.php 소스를 보면 admin_setup.php 페이지로 넘기는 부분이 보이고
<?
include "lib.php";
$connect=dbConn();
$member=member_info();
if(($member[no]&&$member[is_admin]<3&&$member[is_admin]>=1)||($member[no]&&$member[board_name])) move page("admin_setup.php");
이렇게 되어 있습니다.
if문에 있는 조건에 부합하지 않다는 거겠죠.

이번엔 lib.php를 열어 봅니다.
$member=member_info();
얘를 먼저 봅니다.
member_info()라는 함수를 검색해 보겠습니다.

function member_info() {
    global $HTTP_SESSION_VARS, $member_table, $member, $connect;
    if(defined("_member_info_included")&&$member[no]) return $member;
    define("_member_info_included", true);
    if($member[no]) return $member;
    if($HTTP_SESSION_VARS["zb_logged_no"]) {
        $member=mysql_fetch_array(mysql_query("select * from $member_table where no ='".$HTTP_SESSION_VARS["zb_logged_no"]."'"));
        if(!$member[no]) {
            unset($member);
            $member[level] = 10;
        }
    } else $member[level] = 10;
    return $member;
}
저렇게 나오네요.
위에 또 이상한 게 보입니다.

$HTTP_SESSION_VARS;
$HTTP_SESSION_VARS["zb_logged_no"];

php.ini에서 register_long_arrays가 Off로 되어 있으면 저렇게 긴 녀석도 사용을 할 수가 없습니다.
참고로 PHP6에선 아예 삭제한다고 합니다.
그러니 아예 지금부터 사용을 않는 게 좋겠죠.
http://kr2.php.net/manual/kr/function.session-register.php새창으로 열기
$_SESSION;
$_SESSION["zb_logged_no"];

이렇게 바꿔 주시면 됩니다.
이제 정상적으로 잘 되는지 테스트 해 보시기 바랍니다.



출처: http://www.nyaongnyaong.com/636새창으로 열기 [zzin]


  PRINT Text  PRINT HTML  

  Trackbacks for this Posting (0)
'생각하는섬 바닷가 - PHP 5 이상으로 이전시 로그인 안되는 문제'
LIST ALL               GO TO THE TOP


Copyright 1999-2019 Zeroboard

 
생각하는 섬, 바닷가는 리디가 운영하는 개인 칼럼 사이트이며 일부 컨텐츠는 리디 외의 필진에 의해 작성되었습니다. 이곳의 모든 컨텐츠는 출처(Deep Link URL) 및 작가를 명시하는 조건으로 비상업적 용도의 전제/복제가 가능합니다. 그러나 이곳에 게재된 컨텐츠의 취지 또는 작가의 의도가 왜곡되어 해석될 수 있는 컨텐츠 변형은 금지합니다. 이곳에 기재된 전자우편주소에 대한 일체의 수집행위를 거부합니다.(게시일 2008년 1월 1일)
Google
  윤은혜  
Window close