회원가입 같은 것을 할때 입력하는 암호가 보안에 안전한지 여부를 반환하는 함수를 만들었습니다.


<?php
/**
 * @brief 암호의 보안레벨을 반환한다.
 * @details 레벨은 0~3이며 숫자가 높을수록 보안이 뛰어남.\n
 * 보안레벨 0은 사용하지 않는 것이 좋다.
 * @param $password string 암호
 * @param $point_data array 계산된 점수 정보
 * @return int 보안레벨
 */
public static function password_level($password, &$point_data = null) {
    $point_data = array();
 
    ## 문자열 분석 및 점수계산 ##
    $char_point = 0; // 문자 점수
    $change_point = 0; // 변환 점수
 
    $unique_char = array(); // 고유문자
    $old_char = $password[0]; // 이전문자(시작은 첫문자와 똑같게)
    for ( $i = 0; $i < strlen($password); $i++ ) {
        $char = $password[$i];
 
        // 고유문자
        $unique_char[$char] = 0;
 
        // 문자 점수(6 ~ 16자 기준): 6 ~ 7.2
        if ( preg_match('/[0-9]/', $char) ) {
            $char_point += 1;
        } else if ( preg_match('/[a-zA-Z]/', $char) ) {
            $char_point += 1.1;
        } else if ( preg_match('/[\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]/', $char) ) {
            $char_point += 1.2;
        } else {
            return 0;
        }
 
        // 변환 점수(6 ~ 16자 기준): 0.05 ~ 1.5
        $gap = ord($char) - ord($old_char);
        if ( abs($gap) > 1 ) { // 연속성 없이 변환
            $change_point += 0.1;
        } else if ( $gap < 0 ) { // 역순서로 변환
            $change_point += 0.05;
        }
        $old_char = $char;
    }
 
    // 문자길이 점수(6 ~ 16자 기준): 0 ~ 2
    $length_point = floor(strlen($password) / 6);
 
    // 고유문자 점수(16자 기준): 1 ~ 16
    $unique_point = count($unique_char);
 
    // 전체 점수(6 ~ 16자 기준): 0 or 0.3 ~ 345.6
    $total_point = $char_point * $change_point * $length_point * $unique_point;
 
    // 점수정보 참조 배열
    $point_data = array(
        'char' => $char_point,
        'change' => $change_point,
        'length' => $length_point,
        'unique' => $unique_point,
        'total' => $total_point,
    );
 
    ## 보안 레벨 반환 ##
    // 전체 점수를 위한 4종류 점수를 각각 '(최대값 - 최소값) / 레벨'의 값으로,
    // 4종류 점수를 각각 레벨별로 계산하여 레벨별 점수범위를 구했음
    if ( $total_point > 0 && $total_point <= 16.96 ) {
        return 1;
    } else if ( $total_point > 16.96 && $total_point <= 137.36 ) {
        return 2;
    } else if ( $total_point > 137.36 ) {
        return 3;
    } else {
        return 0;
    }
}
?>
Tagged with:  

TTXML의 post중에 <logs></logs>가 없으면 page로 처리되는 버그를 수정하였습니다.

N님의 버그 신고와 소중한 백업데이터를 제공해주신 덕분에 문제점을 수정 할 수 있었습니다.

1.9.2에서 수정된 사항

  • <logs></logs>가 없는 글의 앞 부분이 잘려나가 page로 인식되는 버그 수정

WordPress TTXML Impoter 다운로드 페이지에서 최신버전을 확인하고 받으세요. ^^

소스파일내의 카멜케이스를 언더바로 변환하여 다른 파일로 저장해주는 ruby 스크립트 입니다.

에) helloWorld => hello_world

### camel2under.rb ###
 
if ARGV.empty?
    puts '사용법:'
    puts "#{$0} 소스파일경로 [변환된파일경로]";
    exit
end
 
source_file = ARGV[0];
target_file = ARGV[1] ? ARGV[1] : "#{source_file}.convert";
 
ftarget = File.open(target_file, "w")
 
File.open(source_file).each { |line|
    convert_line = line
 
    line.scan(/[A-Z]?[a-z](?:[a-z0-9])*(?:[A-Z][a-z0-9]+)+/) { |match_str|
        # 대문자로 시작하면
        break if match_str.match(/^[A-Z]/)
 
        replace_str = match_str.gsub(/([a-z0-9])([A-Z])/, '\1_\2').downcase
 
        convert_line = convert_line.gsub(match_str, replace_str)
    }
 
    if ( line != convert_line )
        puts '┏' + line.gsub(/^ +/, '')
        puts '┗' + convert_line.gsub(/^ +/, '')
    end
 
    ftarget.puts convert_line
}
 
ftarget.close
Tagged with:  

TTXML의 <logs></logs> 데이터가 많을 경우 정규표현식 처리로 인해 메모리가 오버하는 문제점을 보완 했습니다.

진사야님이 제공해주신 소중한 백업데이터 덕분에 문제점을 수정 할 수 있었습니다.

1.9.1에서 수정된 사항

  • 정규표현식을 사용하지 않고 <logs></logs> 처리

WordPress TTXML Impoter 다운로드 페이지에서 최신버전을 확인하고 받으세요. ^^

ubuntu_910_countdown

블로그 우측 상단에 우분투 9.10 출시 카운트다운 타이머를 달았습니다.

6개월 마다 새로 나오는 우분투는 언제나 저를 두근거리게 합니다. ^^

타이머 소스 배포 페이지 바로가기


Tagged with: