지속적으로 비번이 틀리는 ip를 블럭하기 (08.10.15)
로빈아빠
본문
지속적으로 비번이 틀리는 ip를 블럭하기 (08.10.15) |
글쓴이 : 아빠불당 (125.♡.174.92)
조회 : 781 추천 : 4 |
singo_intercept.php (1.3K) [19] DATE : 2008-10-14 14:32:31 |
login_fail_list.php (5.7K) [13] DATE : 2008-10-15 13:33:40 |
관리자 페이지 login_fail_list.php 에 접속을 하면 접속로그 삭제일자이전의 로그인 오류 건수를 삭제합니다. 두개를 맞춰서 삭제하기 한 것은 로그인 기록과 대조를 해야할 때가 있을 수 있기 때문 입니다. 그리고, ip를 누르면 해당 ip로 검색이 되게 링크를 추가햇습니다. /adm/login_fail_list.php를 다시 받으면 됩니다 -- 누군가 비밀번호 해킹을 위해서 아이디를 바꾸면서 비밀번호를 입력하고 있다면??? /bbs/login_check을 보면 알겠지만 현재로는 이러한 공격에 대한 대응이 안됩니다. 회원 로그인 비밀번호가 틀릴 경우 db에 id, ip, 날짜를 넣어 둡니다. CREATE TABLE `g4_login_fail_log` ( `log_id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , ) `mb_id` VARCHAR( 255 ) NOT NULL , `ip_addr` VARCHAR( 255 ) NOT NULL , `log_datetime` DATETIME NOT NULL , `log_url` VARCHAR( 255 ) NOT NULL config.php에서 // 로그인 retry $g4['login_fail_log_table'] = $g4['table_prefix'] . "login_fail_log"; // 로그인 오류 logging 지정된 기간(예. 60sec, cf_retry_time_interval)동안 동일 ip에서 지정된 횟수(예: 10회, cf_retry_count)를 초과하는 경우에는 해당 ip를 block 합니다. ip를 바꾸면서 가끔씩 try 해서 오류가 생기는 경우에는 본인이 패스워드를 잊어버려서 그럴 수도 있으므로 블럭하지는 않습니다. ALTER TABLE `g4_config` ADD `cf_retry_time_interval` INT( 11 ) NOT NULL , ADD `cf_retry_count` INT( 11 ) NOT NULL ; /adm/config_form.php <tr class='ht'> <td>아이디 Retry Interval</td> <td> <input type=text class=ed name='cf_retry_time_interval' value='<?=$config[cf_retry_time_interval]?>' size=5> 초 <?=help("지정된 시간동안 아이디/비번의 오류가 발생하는 횟수를 count 하여, 그 횟수가 과도한 경우 해킹으로 간주 합니다.")?> </td> <td>아이디 Retry 횟수</td> <td> <input type=text class=ed name='cf_retry_count' value='<?=$config[cf_retry_count]?>' size=5> 회 <?=help("지정된 시간동안 아이디/비번의 오류가 발생하는 횟수를 count 하여, 그 횟수가 과도한 경우 해킹으로 간주 합니다.")?> </td> </tr> /adm/config_form_update.php cf_retry_time_interval = '$cf_retry_time_interval', cf_retry_count = '$cf_retry_count', /bbs/login_check.php ... if (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password])) { // 로그인 오류를 db에 기록 합니다. $sql = " insert into $g4[login_fail_log_table] (mb_id, ip_addr, log_datetime, log_url) values ('$mb_id', '$_SERVER[REMOTE_ADDR]', '$g4[time_ymdhis]', '/bbs/login_check.php') "; sql_query($sql); // 오류 횟수를 체크해서 차단할지를 결정 합니다. if ($config['cf_retry_time_interval'] > 0 && $config['cf_retry_count']) { $sql = " select count(*) as cnt from $g4[login_fail_log_table] where log_datetime >= " . date("Y-m-d H:i:s", $g4[server_time] - $config['cf_retry_time_interval']); $result = sql_fetch($sql); $ip = $_SERVER[REMOTE_ADDR]; if ($result['cnt'] >= $config['cf_retry_count']) { $pattern = explode("\n", trim($config['cf_intercept_ip'])); if (empty($pattern[0])) // ip 차단목록이 비어 있을 때 $cf_intercept_ip = $ip; else $cf_intercept_ip = trim($config['cf_intercept_ip'])."\n{$ip}"; $sql = " update {$g4['config_table']} set cf_intercept_ip = '$cf_intercept_ip' "; sql_query($sql); } } alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다."); } /adm/admin.menu_200.php에서 array("200103", "로그인오류보기", "$g4[admin_path]/login_fail_list.php"), /adm/login_fail_list.php, /adm/singo_intercept.php(수정본)을 업로드 합니다. 이렇게 해두면 나쁜 xx들의 공격을 수동 또는 자동으로 유용하게 대응할 수 있습니다. |
관련링크
댓글목록
등록된 댓글이 없습니다.