(250725 10:11 수정) 코어 파일 수정에서 extend + 훅 사용으로 변경
(250725 11:23 수정) /bbs/ajax.disposable_email.php 코드 개선 (중복 함수 제거)
사실 원천적으로 100% 완벽하게 차단하지 못할 수 있으나 두 가지의 방법을 동시에 실행하여 꾸준히 나오는 일회용 이메일들도 어느정도 막을 수 있어 98% 정도는 막을 수 있다고 생각합니다
※ 주의
http 환경에서는 2순위 API가 작동하지 않을 수 있습니다 (로컬호스트는 가능 확인함)
첨부파일에 일회용 블랙 도메인을 모아둔 내용들 첨부해놨으니 http 환경이신 분들은
2순위 API 대신 1순위로 사용하셔야 합니다 (우선 아래 방법대로 테스트 먼저 해보세요)
첨부파일 1 설명 : domains.txt
https://raw.githubusercontent.com/disposable/disposable-email-domains/master/domains.txt
현재 1순위로 쓰고 있는 블랙 도메인 (약 5,000 ~ 6,000개)
20 여개의 일회용 이메일 서비스들을 자동으로 크롤링 중 (새로 생긴 일회용 이메일들 빠르게 탐지)
24시간마다 자동으로 새로운 도메인 추가/제거
대신 자동 크롤링이라 오탐 확률 조금 있을 수 있습니다!!
첨부파일 2 설명 : disposable_email_blocklist.conf
약 4,500개 / 커뮤니티에서 확실하게 검증된 블랙 도메인 (갯수는 조금 적지만 오탐 될 확률 적어요)
첨부파일 3 설명 : denyDomains.txt
https://raw.githubusercontent.com/amieiro/disposable-email-domains/master/denyDomains.txt
블랙 도메인 데이터들 15분마다 자동 업데이트 됨
==================================================
코어 파일 수정 없이 적용하기
1. /js/jquery.disposable_check.js 파일 생성
생성한 js 파일에 아래 코드 붙여넣기
[code]
// 일회용 이메일 전용 검증 함수
var reg_mb_disposable_check = function () {
var result = '';
$.ajax({
type: 'POST',
url: g5_bbs_url + '/ajax.disposable_email.php',
data: {
reg_mb_email: $('#reg_mb_email').val(),
},
cache: false,
async: false,
success: function (data) {
result = data;
},
});
return result;
};
[/code]
2. /bbs/ajax.disposable_email.php 파일 생성
클라이언트 검증 (선택사항)
생성한 php 파일에 아래 코드 붙여넣기
[code]
<?php
include_once('./_common.php');
if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest') {
exit;
}
$mb_email = isset($_POST['reg_mb_email']) ? trim($_POST['reg_mb_email']) : '';
if (!$mb_email) {
exit;
}
// 일회용 이메일 검증 실행
if ($msg = disposable_mb_email_server($mb_email)) {
die($msg);
}
[/code]
3. /extend/disposable_email_check.php 파일 생성
서버 검증 (필수)
생성한 php 파일에 아래 코드 붙여넣기
[code]
<?php
if (!defined('_GNUBOARD_')) exit;
// 일회용 이메일 검사 함수
function disposable_mb_email_server($reg_mb_email)
{
$domain = strtolower(substr(strrchr($reg_mb_email, "@"), 1));
// 1순위: GitHub 리스트
$fast_context = stream_context_create([
'http' => [
'timeout' => 1,
'ignore_errors' => true
]
]);
$github_url = "https://raw.githubusercontent.com/disposable/disposable-email-domains/master/domains.txt";
$github_response = @file_get_contents($github_url, false, $fast_context);
if ($github_response !== false) {
$github_domains = array_filter(array_map('trim', explode("\n", $github_response)));
if (in_array($domain, $github_domains)) {
return "일회용 이메일은 사용할 수 없습니다.";
}
}
// 2순위: API
$normal_context = stream_context_create([
'http' => [
'timeout' => 3,
'ignore_errors' => true
]
]);
$api_url = "https://disposable.debounce.io/?email=" . urlencode($domain);
$response = @file_get_contents($api_url, false, $normal_context);
if ($response !== false) {
$data = json_decode($response, true);
if (isset($data['disposable']) && $data['disposable'] === "true") {
return "일회용 이메일은 사용할 수 없습니다.";
}
}
return "";
}
// hook 연결
add_event('register_form_update_valid', 'check_disposable_email_server', 10, 4);
function check_disposable_email_server($w, $mb_id, $mb_nick, $mb_email)
{
if ($msg = disposable_mb_email_server($mb_email)) {
alert($msg, "", true, true);
}
}
[/code]
4. /skin/member/basic/register_form.skin.php 수정
사이트 일반 로그인 기준 스킨 파일
add_javascript('<script src="'.G5_JS_URL.'/jquery.register_form.js"></script>', 0);
기존 스크립트 아래에 추가
[code]
add_javascript('<script src="'.G5_JS_URL.'/jquery.disposable_check.js"></script>', 0);
[/code]
기존 E-mail 검사 스크립트 조건문 안에 추가
[code]
// 이메일 검증 (기존 코드)
if ((f.w.value == "") || (f.w.value == "u" && f.mb_email.defaultValue != f.mb_email.value)) {
var msg = reg_mb_email_check();
if (msg) {
alert(msg);
f.reg_mb_email.select();
return false;
}
}
// ==================================================
// 기존 코드를 이렇게 수정
if ((f.w.value == "") || (f.w.value == "u" && f.mb_email.defaultValue != f.mb_email.value)) {
var msg = reg_mb_email_check();
if (msg) {
alert(msg);
f.reg_mb_email.select();
return false;
}
// 일회용 이메일 검사
var disposable_msg = reg_mb_disposable_check();
if (disposable_msg) {
alert(disposable_msg);
f.reg_mb_email.select();
return false;
}
}
[/code]
5. /skin/social/social_register_member.skin.php 수정
소셜 로그인 기준 스킨 파일 (사용 시)
위 4번 항목과 똑같은 방법으로 진행
============================================================
아래는 코어 파일 수정해서 적용하는 방법입니다
웬만하면 위의 방법으로 적용하셔서
그누보드 업데이트 편하게 할 수 있도록 대비하세요!!
(코어 파일 수정해서 적용하는 방법은 나중에 지울게요
혹시나 이 방법으로 적용한 분 계시다면 내용 보고 되돌리셔서 위 방법으로
다시 작업하시길 권장드립니다)
1. /lib/register.lib.php
function exist_mb_email($reg_mb_email, $reg_mb_id) 함수 아래에 추가
[code]
// 일회용 이메일 검사
function disposable_mb_email($reg_mb_email)
{
$domain = strtolower(substr(strrchr($reg_mb_email, "@"), 1));
// 1순위: GitHub 리스트
$fast_context = stream_context_create([
'http' => [
'timeout' => 1,
'ignore_errors' => true
]
]);
$github_url = "https://raw.githubusercontent.com/disposable/disposable-email-domains/master/domains.txt";
$github_response = @file_get_contents($github_url, false, $fast_context);
if ($github_response !== false) {
$github_domains = array_filter(array_map('trim', explode("\n", $github_response)));
if (in_array($domain, $github_domains)) {
return "일회용 이메일은 사용할 수 없습니다.";
}
}
// 2순위: API (3초)
$normal_context = stream_context_create([
'http' => [
'timeout' => 3,
'ignore_errors' => true
]
]);
$api_url = "https://disposable.debounce.io/?email=" . urlencode($domain);
$response = @file_get_contents($api_url, false, $normal_context);
if ($response !== false) {
$data = json_decode($response, true);
if (isset($data['disposable']) && $data['disposable'] === "true") {
return "일회용 이메일은 사용할 수 없습니다.";
}
}
return "";
}
[/code]
2. /bbs/ajax.mb_email.php
if ($msg = exist_mb_email($mb_email, $mb_id)) die($msg); 아래에 추가
[code]
if ($msg = disposable_mb_email($mb_email)) die($msg);
[/code]
3. /bbs/register_form_update.php
// 이름에 한글명 체크를 하지 않는다.
//if ($msg = valid_mb_name($mb_name)) alert($msg, "", true, true);
if ($msg = valid_mb_nick($mb_nick)) alert($msg, "", true, true);
if ($msg = valid_mb_email($mb_email)) alert($msg, "", true, true);
if ($msg = prohibit_mb_email($mb_email)) alert($msg, "", true, true);
아래에 추가
[code]
if ($msg = disposable_mb_email($mb_email)) alert($msg, "", true, true);
[/code]
코어 파일을 기준으로 수정하신다면,
회원가입 페이지의 상단 PHP에
[code]
add_javascript('<script src="' . G5_JS_URL . '/jquery.register_form.js"></script>', 14);
[/code]
스크립트가 추가되어 있어야 하며,
회원가입 페이지의 스크립트에
[code]
// 이메일 검증
if ((f.w.value == "") || (f.w.value == "u" && f.mb_email.defaultValue != f.mb_email.value)) {
var msg = reg_mb_email_check();
if (msg) {
alert(msg);
f.reg_mb_email.select();
return false;
}
}
[/code]
이메일 검증 코드가 추가 되어 있어야 정상 작동합니다
==================================================
테스트 결과 1순위는 약 0.3~0.5초, 2순위는 약 1~2초 정도 로딩이 걸립니다
1순위에서 일회용 이메일 찾으면 바로 return, 찾지 못하면 2순위로 가서
최대 4초 (모두 검증 안될 시) 걸립니다
두 군데 모두 일회용 이메일이 일치하지 않으면 그대로 검증 통과해버리고
타임아웃은 사용자 경험에서 느리면 느릴수록 좋지 않아 테스트 해보시고 조절하시길 권장드립니다
댓글 9개
게시글 목록
| 번호 | 제목 |
|---|---|
| 24318 | |
| 24317 | |
| 24315 | |
| 24309 | |
| 24294 | |
| 24293 | |
| 24277 | |
| 24262 | |
| 24260 | |
| 24253 | |
| 24251 | |
| 24236 | |
| 24233 | |
| 24228 | |
| 24226 | |
| 24221 | |
| 24214 | |
| 24203 | |
| 24201 | |
| 24199 | |
| 24196 | |
| 24195 | |
| 24194 | |
| 24192 | |
| 24191 | |
| 24187 | |
| 24185 | |
| 24183 | |
| 24172 | |
| 24168 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기