[첫화면으로]UseModWiki소스수정/사용자암호보안

마지막으로 [b]

변경사항 (가장 최근의 "소소한 수정"부터) (다른 변경사항 없음)

-7,7 +7,7
** crypt 함수의 호출로 인한 퍼포먼스 저하. crypt 는 암호화 함수라기보다는 단방향 해쉬 함수에 가깝기 때문에 크게 저하될 것이라 생각되지는 않으나...
* 기존에 사용하던 사용자 데이타와 호환되지 않는다. (호환되게 할수도 있겠으나 귀찮아서..) 굳이 호환되게 하고 싶다면, 아래에 나오는 각종 if 문에서, 기존에 사용되던 조건문과 새로 변경된 조건문을 둘 다 검사하게 OR 로 연결해 주면 될 것이다.
:
{{{perl
{{{#!vim perl
...
package UseModWiki;
use strict;

-18,7 +18,7
}}}
* 위에 있는 $HashKey 변수는 crypt 에서 사용되는 키 값이다. salt 가 아닌 다른 문자열을 사용하도록 하고, 가끔 생각날때 한번씩 바꿔주면 좋을 것이다. 키를 바꾸더라도 기존에 사용하던 사용자 데이터는 그대로 사용할 수 있다. (키 값은 처음 두 글자만 의미가 있다. 세번째 이후는 바꾸나마나이니 주의)
:
{{{perl
{{{#!vim perl
sub UserIsAdmin {
    ...
    foreach (split(/\s+/, $AdminPass)) {

-32,7 +32,7
}
}}}
:
{{{perl
{{{#!vim perl
sub UserIsEditor {
    ...
    foreach (split(/\s+/, $EditPass)) {

-46,7 +46,7
}
}}}
:
{{{perl
{{{#!vim perl
sub DoUpdatePrefs {
    my ($username, $password);
### 다음 라인 추가

-87,7 +87,7
}
}}}
:
{{{perl
{{{#!vim perl
sub DoLogin {
    ...
        &LoadUserData();


사용자 암호를 암호화하여 저장

...
package UseModWiki;
use strict;
### 다음 두 줄 추가
use vars qw($HashKey);
$HashKey = "salt"; # 2-character string
###
sub UserIsAdmin {
    ...
    foreach (split(/\s+/, $AdminPass)) {
        next  if ($_ eq "");
### 다음 라인 교체
#       return 1  if ($userPassword eq $_);
        return 1  if (crypt($_, $userPassword) eq $userPassword);
###
    }
    return 0;
}
sub UserIsEditor {
    ...
    foreach (split(/\s+/, $EditPass)) {
        next  if ($_ eq "");
### 다음 라인 교체
#       return 1  if ($userPassword eq $_);
        return 1  if (crypt($_, $userPassword) eq $userPassword);
###
    }
    return 0;
}
sub DoUpdatePrefs {
    my ($username, $password);
### 다음 라인 추가
    my $hashpass = "";
###
    ...
    $password = &GetParam("p_password",  "");
### 다음 라인 추가
    $hashpass = crypt($password, $HashKey);
###
    if ($password eq "") {
        print T('Password removed.'), '<br>';
        undef $UserData{'password'};
    } elsif ($password ne "*") {
        print T('Password changed.'), '<br>';
### 다음 라인 교체
#       $UserData{'password'} = $password;
        $UserData{'password'} = $hashpass;
###
    }
    if ($AdminPass ne "") {
        $password = &GetParam("p_adminpw",  "");
### 다음 라인 추가
        $hashpass = crypt($password, $HashKey);
###
        if ($password eq "") {
            print T('Administrator password removed.'), '<br>';
            undef $UserData{'adminpw'};
        } elsif ($password ne "*") {
            print T('Administrator password changed.'), '<br>';
### 다음 라인 교체
#           $UserData{'adminpw'} = $password;
            $UserData{'adminpw'} = $hashpass;
###
            if (&UserIsAdmin()) {
                print T('User has administrative abilities.'), '<br>';
    ...
}
sub DoLogin {
    ...
        &LoadUserData();
### 다음 라인 교체
#       if (defined($UserData{'password'}) &&
#               ($UserData{'password'} eq $password)) {
        if (defined($UserData{'password'}) &&
                (crypt($password, $UserData{'password'}) eq $UserData{'password'})) {
###
            $SetCookie{'id'} = $uid;
    ...


위키위키분류

마지막 편집일: 2007-1-8 12:19 pm (변경사항 [d])
939 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기