그누보드 [G5] 로그인 해킹차단
페이지 정보
본문
질문답변에서 답변없는 글을 읽다보니 재미난 내용이 있어서 가져왔습니다
원본 : https://sir.kr/qa/35957
그누보드4 버전을 그누보드5 버전으로 코드를 변경했습니다
실제 적용은 안해봤습니다
<?php
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
/*
제목 : 그누보드 비밀번호 해킹 차단 툴 (extend 등록파일)
출처 : 로빈아빠 2011-11-19
목적 : 암호 해킹 시도시 IP 차단 (로그인 스크립트로 암호를 찾아내려는 경우)
설치 : 내용을 ar.hack.passwd.php 로 만들어서 extend 폴더에 업로드
다운 :
설명 :
1) 로그인시 암호를 잘못입력하는 경우 기록파일에 저장을 한다.
2) 한IP에서 일정시간동안 정해진수 이상 로그인을 시도하면 로그인과다로 표시하고 종료한다.
레벨이 8 이상인 경우 접속제한수가 2배로 됨..
3) 종료시 로그인 시도 담당자와 관리자에게 쪽지를 보낸다.
4) 로그인성공시 실패 기록을 삭제한다.
5) 접속제한수는 제한은 20회 IP차단은 50회 로되어있습니다. 소스에서 수정가능
$max_limit_out=30; //하루동안 50번이상 시도하면 ip를 접근차단으로 지정하고 종료함..
$max_limit_warn=20; //하루동안 20번이상 시도하면 접속을 종료하고 로그인 시도 담당자와 관리자에게 쪽지를 보냄
*/
if (strstr($PHP_SELF,"login_check.php") && $_POST['mb_id']) {
$max_limit_out = 30; //하루동안 50번이상 시도하면 ip를 접근차단으로 지정하고 종료함..
$max_limit_warn = 20; //하루동안 20번이상 시도하면 접속을 종료하고 로그인 시도 담당자와 관리자에게 쪽지를 보냄
$mb = sql_fetch("select mb_id,mb_password,mb_level from {$g5['member_table']} where mb_id='{$_POST['mb_id']}' limit 1");
if ($mb['mb_level'] >= 8) {
$max_limit_out = $max_limit_out*2;
$max_limit_warn = $max_limit_warn*2;
}
$key1 = date('ymd')."|{$_SERVER['REMOTE_ADDR']}";
if (G5_GNUBOARD_VER > 5.4) {
if (G5_STRING_ENCRYPT_FUNCTION == 'create_hash') {
$ty_password = get_encrypt_string($_POST['mb_password']);
} else {
$ty_password = sql_password($_POST['mb_password']);
}
} else {
$ty_password = sql_password($_POST['mb_password']);
}
if ($mb && $mb['mb_password'] == $ty_password) {
sql_fetch("delete from {$g5['point_table']} where mb_id='{$mb['mb_id']}' and po_rel_table='@login_check' and po_rel_action='{$key1}'");
}
else if ($mb && $mb['mb_password'] != $ty_password) {
$row = sql_fetch("select count(*) as cnt from {$g5['point_table']} where mb_id='{$mb['mb_id']}' and po_rel_table='@login_check' and po_rel_action='{$key1}'");
if ($row['cnt'] > $max_limit_out) {
//접근차단 지정
if (!strstr($config['cf_intercept_ip'],$_SERVER['REMOTE_ADDR'])) {
if ($config['cf_intercept_ip']) $config['cf_intercept_ip'].="\n";
$config['cf_intercept_ip'].=$_SERVER['REMOTE_ADDR'];
$sql="update {$g5['config_table']} set cf_intercept_ip='".sql_real_escape_string($config['cf_intercept_ip'])."'";
//echo $sql;
sql_query($sql);
}
//alert("접근시도 과다. 접근차단 됨");
exit;
}
// 포인트 건별 생성
$sql = "
insert into {$g5['point_table']} set
mb_id = '{$mb['mb_id']}',
po_datetime = '{$g5['time_ymdhis']}',
po_content = '".addslashes("로그인시도:{$_SERVER['REMOTE_ADDR']} {$_POST['mb_password']} {$_SERVER['HTTP_USER_AGENT']}")."',
po_point = '0',
po_rel_table = '@login_check',
po_rel_id = '{$mb['mb_id']}',
po_rel_action = '{$key1}' "
;
sql_query($sql);
//접근이 너무 많음 차단함..
if ($row['cnt'] > $max_limit_warn) {
$tmp_row = sql_fetch(" select max(me_id) as max_me_id from {$g5['memo_table']} ");
$me_id = $tmp_row['max_me_id'] + 1;
// 본인에게 쪽지보냄
$sql = " insert into {$g5['memo_table']} ( me_id, me_recv_mb_id, me_send_mb_id, me_send_datetime, me_memo ) values ( '{$me_id}', '{$mb['mb_id']}', '{$mb['mb_id']}', '{$g5['time_ymdhis']}', '로그인회수:{$row['cnt']}회 (시도ID:{$_POST['mb_id']} {$_SERVER['REMOTE_ADDR']})\n{$_SERVER['HTTP_USER_AGENT']}' ) ";
sql_query($sql);
// 관리자에게 쪽지보냄
if ($mb['mb_id'] != $config['cf_admin']) {
$tmp_row = sql_fetch(" select max(me_id) as max_me_id from {$g5['memo_table']} ");
$me_id = $tmp_row['max_me_id'] + 1;
// 쪽지 INSERT
$sql = " insert into {$g5['memo_table']} ( me_id, me_recv_mb_id, me_send_mb_id, me_send_datetime, me_memo ) values ( '{$me_id}', '{$config['cf_admin']}', '{$mb['mb_id']}', '{$g5['time_ymdhis']}', '로그인회수:{$row['cnt']}회 (시도ID:{$_POST['mb_id']} {$_SERVER['REMOTE_ADDR']})\n{$_SERVER['HTTP_USER_AGENT']}' ) ";
sql_query($sql);
}
alert("로그인 실패 횟수를 초과했습니다. 다음날 로그인을 시도해주세요. ({$row['cnt']}/{$max_limit_warn})");
exit;
}
}
}
원본 : https://sir.kr/qa/35957
그누보드4 버전을 그누보드5 버전으로 코드를 변경했습니다
실제 적용은 안해봤습니다
<?php
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
/*
제목 : 그누보드 비밀번호 해킹 차단 툴 (extend 등록파일)
출처 : 로빈아빠 2011-11-19
목적 : 암호 해킹 시도시 IP 차단 (로그인 스크립트로 암호를 찾아내려는 경우)
설치 : 내용을 ar.hack.passwd.php 로 만들어서 extend 폴더에 업로드
다운 :
설명 :
1) 로그인시 암호를 잘못입력하는 경우 기록파일에 저장을 한다.
2) 한IP에서 일정시간동안 정해진수 이상 로그인을 시도하면 로그인과다로 표시하고 종료한다.
레벨이 8 이상인 경우 접속제한수가 2배로 됨..
3) 종료시 로그인 시도 담당자와 관리자에게 쪽지를 보낸다.
4) 로그인성공시 실패 기록을 삭제한다.
5) 접속제한수는 제한은 20회 IP차단은 50회 로되어있습니다. 소스에서 수정가능
$max_limit_out=30; //하루동안 50번이상 시도하면 ip를 접근차단으로 지정하고 종료함..
$max_limit_warn=20; //하루동안 20번이상 시도하면 접속을 종료하고 로그인 시도 담당자와 관리자에게 쪽지를 보냄
*/
if (strstr($PHP_SELF,"login_check.php") && $_POST['mb_id']) {
$max_limit_out = 30; //하루동안 50번이상 시도하면 ip를 접근차단으로 지정하고 종료함..
$max_limit_warn = 20; //하루동안 20번이상 시도하면 접속을 종료하고 로그인 시도 담당자와 관리자에게 쪽지를 보냄
$mb = sql_fetch("select mb_id,mb_password,mb_level from {$g5['member_table']} where mb_id='{$_POST['mb_id']}' limit 1");
if ($mb['mb_level'] >= 8) {
$max_limit_out = $max_limit_out*2;
$max_limit_warn = $max_limit_warn*2;
}
$key1 = date('ymd')."|{$_SERVER['REMOTE_ADDR']}";
if (G5_GNUBOARD_VER > 5.4) {
if (G5_STRING_ENCRYPT_FUNCTION == 'create_hash') {
$ty_password = get_encrypt_string($_POST['mb_password']);
} else {
$ty_password = sql_password($_POST['mb_password']);
}
} else {
$ty_password = sql_password($_POST['mb_password']);
}
if ($mb && $mb['mb_password'] == $ty_password) {
sql_fetch("delete from {$g5['point_table']} where mb_id='{$mb['mb_id']}' and po_rel_table='@login_check' and po_rel_action='{$key1}'");
}
else if ($mb && $mb['mb_password'] != $ty_password) {
$row = sql_fetch("select count(*) as cnt from {$g5['point_table']} where mb_id='{$mb['mb_id']}' and po_rel_table='@login_check' and po_rel_action='{$key1}'");
if ($row['cnt'] > $max_limit_out) {
//접근차단 지정
if (!strstr($config['cf_intercept_ip'],$_SERVER['REMOTE_ADDR'])) {
if ($config['cf_intercept_ip']) $config['cf_intercept_ip'].="\n";
$config['cf_intercept_ip'].=$_SERVER['REMOTE_ADDR'];
$sql="update {$g5['config_table']} set cf_intercept_ip='".sql_real_escape_string($config['cf_intercept_ip'])."'";
//echo $sql;
sql_query($sql);
}
//alert("접근시도 과다. 접근차단 됨");
exit;
}
// 포인트 건별 생성
$sql = "
insert into {$g5['point_table']} set
mb_id = '{$mb['mb_id']}',
po_datetime = '{$g5['time_ymdhis']}',
po_content = '".addslashes("로그인시도:{$_SERVER['REMOTE_ADDR']} {$_POST['mb_password']} {$_SERVER['HTTP_USER_AGENT']}")."',
po_point = '0',
po_rel_table = '@login_check',
po_rel_id = '{$mb['mb_id']}',
po_rel_action = '{$key1}' "
;
sql_query($sql);
//접근이 너무 많음 차단함..
if ($row['cnt'] > $max_limit_warn) {
$tmp_row = sql_fetch(" select max(me_id) as max_me_id from {$g5['memo_table']} ");
$me_id = $tmp_row['max_me_id'] + 1;
// 본인에게 쪽지보냄
$sql = " insert into {$g5['memo_table']} ( me_id, me_recv_mb_id, me_send_mb_id, me_send_datetime, me_memo ) values ( '{$me_id}', '{$mb['mb_id']}', '{$mb['mb_id']}', '{$g5['time_ymdhis']}', '로그인회수:{$row['cnt']}회 (시도ID:{$_POST['mb_id']} {$_SERVER['REMOTE_ADDR']})\n{$_SERVER['HTTP_USER_AGENT']}' ) ";
sql_query($sql);
// 관리자에게 쪽지보냄
if ($mb['mb_id'] != $config['cf_admin']) {
$tmp_row = sql_fetch(" select max(me_id) as max_me_id from {$g5['memo_table']} ");
$me_id = $tmp_row['max_me_id'] + 1;
// 쪽지 INSERT
$sql = " insert into {$g5['memo_table']} ( me_id, me_recv_mb_id, me_send_mb_id, me_send_datetime, me_memo ) values ( '{$me_id}', '{$config['cf_admin']}', '{$mb['mb_id']}', '{$g5['time_ymdhis']}', '로그인회수:{$row['cnt']}회 (시도ID:{$_POST['mb_id']} {$_SERVER['REMOTE_ADDR']})\n{$_SERVER['HTTP_USER_AGENT']}' ) ";
sql_query($sql);
}
alert("로그인 실패 횟수를 초과했습니다. 다음날 로그인을 시도해주세요. ({$row['cnt']}/{$max_limit_warn})");
exit;
}
}
}
댓글목록
등록된 댓글이 없습니다.