웹마스터 팁
주민등록 입력 폼 1.2.0
2009.04.10 16:19
에고.. 왠지 버젼이 바뀔때 마다 기존에 적은걸 다시 적는 기분이 드네요 ㅡㅡ;;
기존에 올렸던 주민등록 입력 폼에 많은 분들이 문의 해주신 내용들과 불편했던 내용들을 한꺼번에 다시 한번 정리 했습니다.
1.2.0 버젼 기준으로 좀더 세세하게 다시 수정 하였습니다.
첨부 파일은 1.2.0 full 새로 다운 받아서 아래 내용만 수정 하였습니다.
아래 내용 작성 끝나면 다시 삭제될 자료 ;;;
1. DB Tool
개인 서버 사용자 -
http://www.navicat.com/download.html - non-commercial(Free) - lite version 으로 다운 받으시면 됩니다.
비 상업사이트에 한해 무료 제공인듯 합니다.
해당 sql서버에 직접 접속이 가능하다면 프로그램은 개인 로컬PC에 설치하고 원격으로 서버에 접속도 가능합니다.
호스팅 업체 사용자 -
http://www.phpmyadmin.net/home_page/downloads.php
설치 후 웹페이지를 통해 접속하는 프로그램입니다.
아래 설명은 navicat 기준으로 설명합니다.
1. DBTool 을 사용하여 xe_member 테이블의 디자인 보기를 선택합니다.
2. insert field 를 (필드 삽입)을 선택하여 jumin - char(13) 으로 필드를 생성 합니다.
3. /xe/modules/member/skins/default/filter/signup.xml
<filter name="signup" module="member" act="procMemberInsert" extend_filter="member.getJoinFormList" confirm_msg_code="confirm_submit">
<form>
<node target="user_id" required="true" minlength="2" maxlength="80" filter="userid" />
<node target="password1" required="true" minlength="6" maxlength="20" />
<node target="password2" required="true" minlength="6" maxlength="20" equalto="password1" />
<node target="user_name" required="true" minlength="2" maxlength="40" />
<node target="nick_name" required="true" minlength="2" maxlength="40" />
<node target="email_address" required="true" minlength="1" maxlength="200" filter="email"/>
<node target="jumin" required="true" minlength="13" maxlength="13" filter="jumin"/>
</form>
<parameter>
<param name="accept_agreement" target="accept_agreement" />
<param name="member_srl" target="member_srl" />
<param name="user_id" target="user_id" />
<param name="password" target="password1" />
<param name="user_name" target="user_name" />
<param name="nick_name" target="nick_name" />
<param name="jumin" target="jumin" />
<param name="homepage" target="homepage" />
<param name="blog" target="blog" />
<param name="birthday" target="birthday" />
<param name="allow_mailing" target="allow_mailing" />
<param name="email_address" target="email_address" />
</parameter>
<response callback_func="completeInsert">
<tag name="error" />
<tag name="message" />
<tag name="redirect_url" />
</response>
</filter>
4. /xe/modules/member/queries/insertMember.xml
<query id="insertMember" action="insert">
<tables>
<table name="member" />
</tables>
<columns>
<column name="member_srl" var="member_srl" filter="number" notnull="notnull" />
<column name="user_id" var="user_id" filter="userid" notnull="notnull" />
<column name="email_address" var="email_address" filter="email" notnull="notnull" />
<column name="password" var="password" notnull="notnull" />
<column name="email_id" var="email_id" notnull="notnull" />
<column name="email_host" var="email_host" notnull="notnull" />
<column name="user_name" var="user_name" notnull="notnull" minlength="1" maxlength="40" />
<column name="nick_name" var="nick_name" notnull="notnull" minlength="1" maxlength="40" />
<column name="homepage" var="homepage" />
<column name="jumin" var="jumin" />
<column name="blog" var="blog" />
<column name="birthday" var="birthday" />
<column name="allow_mailing" var="allow_mailing" default="Y" />
<column name="allow_message" var="allow_message" default="Y" />
<column name="denied" var="denied" default="N" />
<column name="limit_date" var="limit_date" />
<column name="regdate" var="regdate" default="curdate()" />
<column name="last_login" var="last_login" default="curdate()" />
<column name="is_admin" var="is_admin" default="N" />
<column name="description" var="description" />
<column name="extra_vars" var="extra_vars" />
</columns>
</query>
5. /xe/modules/member/queries/getMemberSrl.xml
<query id="getMemberSrl" action="select">
<tables>
<table name="member" />
</tables>
<columns>
<column name="member_srl" />
</columns>
<conditions>
<condition operation="equal" column="user_id" var="user_id" pipe="and" />
<condition operation="equal" column="email_address" var="email_address" pipe="and" />
<condition operation="equal" column="nick_name" var="nick_name" pipe="and" />
<condition operation="equal" column="jumin" var="jumin" pipe="and" />
</conditions>
</query>
6.xe/modules/member/tpl/js/signup_check.js
- line 17
function memberSetEvent() {
var fo_obj = xGetElementById('fo_insert_member');
for(var node_name in fo_obj) {
var obj = fo_obj[node_name];
if(!obj || typeof(obj.nodeName)=="undefined" || obj.nodeName != "INPUT") continue;
if(node_name != "user_id" && node_name != "nick_name" && node_name != "email_address" && node_name!="jumin") continue;
xAddEventListener(obj, 'blur', memberCheckValue);
}
}
7. /xe/modules/member/lang/ko.lang.php
-line 80
$lang->search_target_list = array(
'user_id' => '아이디',
'user_name' => '이름',
'nick_name' => '닉네임',
'email_address' => '메일주소',
'jumin' => 주민등록번호,
'regdate' => '가입일시',
'regdate_more' => '가입일시(이상)',
'regdate_less' => '가입일시(이하)',
'last_login' => '최근로그인일시',
'last_login_more' => '최근로그인일시(이상)',
'last_login_less' => '최근로그인일시(이하)',
'extra_vars' => '확장변수',
);
// 관리자 페이지에서 주민등록번호로 검사 필드 추가
- line 142 ~ 143 / line 165
$lang->msg_exists_jumin = '이미 존재하는 주민등록번호입니다. 계정도용이 의심 될 경우 관리자에게 연락 주세요.';
$lang->msg_false_jumin_no = '잘못된 주민등록번호 형식입니다.';
$lang->about_jumin = '- 를 제외한 숫자 13자리를 입력해 주세요.';
8. /xe/common/lang/ko.lang.php
- line 89
$lang->jumin = '주민등록번호';
- line 299
$lang->filter->invalid_jumin = '잘못된 %s 형식입니다.';
9. /xe/modules/member/skins/default/signup_form.html
- line 67
<tr>
<th><div>{$lang->jumin}</div></th>
<td>
<input type="password" name="jumin" id="jumin" value="" maxlength="13" class="inputTypeText"/> <input type="checkbox" name="foreigner" value="1" /> 외국인 (*외국인인 경우 체크 하세요)
<p>{$lang->about_jumin}</p>
</td>
</tr>
10. /xe/modules/member/member.controller.php
- line 501 ~ 514
/**
* @brief 회원 가입시 특정 항목들에 대한 값 체크
**/
function procMemberCheckValue() {
$name = Context::get('name');
$value = Context::get('value');
if(!$value) return;
$oMemberModel = &getModel('member');
// 로그인 여부 체크
$logged_info = Context::get('logged_info');
switch($name) {
case 'user_id' :
// 금지 아이디 검사
if($oMemberModel->isDeniedID($value)) return new Object(0,'denied_user_id');
// 중복 검사
$member_srl = $oMemberModel->getMemberSrlByUserID($value);
if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_user_id');
break;
case 'nick_name' :
// 중복 검사
$member_srl = $oMemberModel->getMemberSrlByNickName($value);
if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_nick_name');
break;
case 'email_address' :
// 중복 검사
$member_srl = $oMemberModel->getMemberSrlByEmailAddress($value);
if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_email_address');
break;
case 'jumin' : // 주민등록 번호 검사
// 형식 검사
if($oMemberModel->isTrueNumber($value)==false) return new Object(0,'msg_false_jumin_no');
//중복 검사
$member_srl = $oMemberModel->getMemberSrlByJumin($value);
if($member_srl && $logged_info->member_srl != $member_srl) return new Object(0,'msg_exists_jumin');
break;
case 'jumin2' : // 외국인 번호 검사.
// 형식 검사
if($oMemberModel->isTrueNumber2($value)==false) return new Object(0,'msg_false_jumin_no');
//중복 검사
$member_srl = $oMemberModel->getMemberSrlByJumin($value);
if($member_srl && $logged_info->member_srl != $member_srl) return new Object(0,'msg_exists_jumin');
break;
}
}
// 외국인가입이 필요없는 경우는 case 'jumin2' : 아래는 삭제 하셔도 됩니다.
- line 532
/**
* @brief 회원 가입
**/
function procMemberInsert() {
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('member'+
'+
');
// 관리자가 회원가입을 허락하였는지 검사
if($config->enable_join != 'Y'+
') return $this->stop('msg_signup_disabled');
// 약관에 동의하였는지 검사 (약관이 있을 경우만)
if($config->agreement && Context::get('+
'accept_agreement')!='Y') return $this->stop('msg_accept_agreement');
// 필수 정보들을 미리 추출
$args = Context::gets('user_id','user_name','nick_name','jumin','homepage','blog','birthday','email_address','password','allow_mailing');
$args->member_srl = getNextSequence();
// 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제
$all_args = Context::getRequestVars();
unset($all_args->module);
unset($all_args->act);
unset($all_args->is_admin);
unset($all_args->description);
unset($all_args->group_srl_list);
unset($all_args->body);
unset($all_args->accept_agreement);
unset($all_args->signature);
// 메일 인증 기능 사용시 회원 상태를 denied로 설정
if ($config->enable_confirm == 'Y') $args->denied = 'Y';
// 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력
$extra_vars = delObjectVars($all_args, $args);
$args->extra_vars = serialize($extra_vars);
// member_srl의 값에 따라 insert/update
$output = $this->insertMember($args);
if(!$output->toBool()) return $output;
// 로그인 시킴
if ($config->enable_confirm != 'Y') $this->doLogin($args->user_id);
$this->add('+
'member_srl', $args->member_srl);
if($config->redirect_url) $this->add('+
'redirect_url', $config->redirect_url);
if ($config->enable_confirm == 'Y') {
$msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $args->email_address);
$this->setMessage($msg);
}
else $this->setMessage('success_registed');
}
- line 1444
/**
* @brief member 테이블에 사용자 추가
**/
function insertMember(&$args, $password_is_hashed = false) {
// trigger 호출 (before)
$output = ModuleHandler::triggerCall('member.insertMember', 'before', $args);
if(!$output->toBool()) return $output;
// 멤버 설정 정보에서 가입약관 부분을 재확인
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('member');
$logged_info = Context::get('logged_info');
// 임시 제한 일자가 있을 경우 제한 일자에 내용 추가
if($config->limit_day) $args->limit_date = date("YmdHis", time()+$config->limit_day*60*60*24);
// 입력할 사용자의 아이디를 소문자로 변경
$args->user_id = strtolower($args->user_id);
// 필수 변수들의 조절
if($args->allow_mailing!='Y') $args->allow_mailing = 'N';
if($args->denied!='Y') $args->denied = 'N'+
';
$args->allow_message= 'Y';
if($logged_info->is_admin == 'Y') {
if($args->is_admin!='Y') $args->is_admin = 'N';
} else {
unset($args->is_admin);
}
list($args->email_id, $args->email_host) = explode('@', $args->email_address);
// 홈페이지, 블로그의 주소 검사
if($args->homepage && !preg_match("/^http:\/\//i",$args->homepage)) $args->homepage = 'http://'.$args->homepage;
if($args->blog && !preg_match("/^http:\/\//i",$args->blog)) $args->blog = 'http://'+
'.$args->blog;
// 모델 객체 생성
$oMemberModel = &getModel('member');
// 금지 아이디인지 체크
if($oMemberModel->isDeniedID($args->user_id)) return new Object(-1,'denied_user_id');
// 아이디, 닉네임, email address 의 중복 체크
$member_srl = $oMemberModel->getMemberSrlByUserID($args->user_id);
if($member_srl) return new Object(-1,'msg_exists_user_id');
$member_srl = $oMemberModel->getMemberSrlByNickName($args->nick_name);
if($member_srl) return new Object(-1,'msg_exists_nick_name');
$member_srl = $oMemberModel->getMemberSrlByEmailAddress($args->email_address);
if($member_srl) return new Object(-1,'msg_exists_email_address');
$member_srl = $oMemberModel->getMemberSrlByJumin($args->jumin);
if($member_srl) return new Object(-1, 'msg_exists_jumin');
$oDB = &DB::getInstance();
$oDB->begin();
// DB에 입력
$args->member_srl = getNextSequence();
if($args->password && !$password_is_hashed) $args->password = md5($args->password);
elseif(!$args->password) unset($args->password);
$output = executeQuery('member.insertMember', $args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
// 입력된 그룹 값이 없으면 기본 그룹의 값을 등록
if(!$args->group_srl_list) {
$default_group = $oMemberModel->getDefaultGroup(0);
// 기본 그룹에 추가
$output = $this->addMemberToGroup($args->member_srl,$default_group->group_srl);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
// 입력된 그룹 값이 있으면 해당 그룹의 값을 등록
} else {
$group_srl_list = explode('|@|', $args->group_srl_list);
for($i=0;$i<count($group_srl_list);$i++) {
$output = $this->addMemberToGroup($args->member_srl,$group_srl_list[$i]);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
}
}
// 메일 인증 모드 사용시(가입된 회원이 denied일 때) 인증 메일 발송
if ($args->denied == 'Y') {
// 인증 DB에 데이터를 넣음
$auth_args->user_id = $args->user_id;
$auth_args->member_srl = $args->member_srl;
$auth_args->new_password = $args->password;
$auth_args->auth_key = md5(rand(0, 999999));
$auth_args->is_register = 'Y';
$output = executeQuery('member.insertAuthMail', $auth_args);
if (!$output->toBool()) {
$oDB->rollback();
return $output;
}
// 메일 내용을 구함
Context::set('auth_args', $auth_args);
Context::set('member_info', $args);
$member_config = $oModuleModel->getModuleConfig('member');
if(!$member_config->skin) $this->member_config->skin = "default";
if(!$member_config->colorset) $this->member_config->colorset = "white";
Context::set('member_config', $member_config);
$tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin);
if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default');
$oTemplate = &TemplateHandler::getInstance();
$content = $oTemplate->compile($tpl_path, 'confirm_member_account_mail');
// 사이트 웹마스터 정보를 구함
$oModuleModel = &getModel('module');
$member_config = $oModuleModel->getModuleConfig('member');
// 메일 발송
$oMail = new Mail();
$oMail->setTitle( Context::getLang('msg_confirm_account_title') );
$oMail->setContent($content);
$oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email);
$oMail->setReceiptor( $args->user_name, $args->email_address );
$oMail->send();
}
// trigger 호출 (after)
if($output->toBool()) {
$trigger_output = ModuleHandler::triggerCall('member.insertMember', 'after', $args);
if(!$trigger_output->toBool()) {
$oDB->rollback();
return $trigger_output;
}
}
$oDB->commit(true);
$output->add('member_srl', $args->member_srl);
return $output;
}
11. /xe/modules/member/member.model.php
- line 244
/**
* @brief jumin에 해당하는 member_srl을 구함
**/
function getMemberSrlByJumin($jumin){
$args->jumin = $jumin;
$output = executeQuery('member.getMemberSrl', $args);
return $output->data->member_srl;
}
- line 270 ~ 321
/**
* @brief 주민등록번호 형식 확인
**/
function isTrueNumber($jumin){
$total = 0;
for($i=0;$i<13;$i++){
$sval = substr($jumin, $i, 1);
if($i < 8){
$total = $total + ($sval * ($i+2));
}
if($i > 7 && $i < 12){
$total = $total + ($sval * ($i-6));
}
}
$total = $total % 11;
$total2 = 11 - $total;
if($total2 > 9) $total2 = $total2 % 10;
$total = substr($jumin, 12, 1);
if($total == $total2) return true;
else return false;
}
/**
* @brief 외국인번호 확인
**/
function isTrueNumber2($jumin){
for($i=0;$i<13;$i++){
$buf[$i] = (int)substr($jumin, $i, 1);
}
$odd = (int)$buf[7] * 10 + (int)$buf[8];
if($odd % 2 != 0){
return false;
}
if(($buf[11] != 6) && ($buf[11] != 7) && ($buf[11] != 8) && ($buf[11] != 9)){
return false;
}
$multi = "2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5";
$multipliers = str_split(",", $multi);
$sum = 0;
for($i=0;$i<12;$i++){
$sum += (int)$bnf[$i] *= (int)$multipliers[$i];
}
$sum = 11 - ($sum % 11);
if($sum >= 10) $sum -= 10;
$sum += 2;
if($sum >= 10) $sum -=10;
if($sum != $buf[12]) {
return false;
} else {
return true;
}
}
// 외국인 가입이필요없는 경우 외국인 번호 체크 삭제
12. /xe/common/js/xml-js_filter.js
- line 192 ~ 19
function XmlJsFilterExecuteFilter(filter, value) {
switch(filter) {
case "email" :
case "email_address" :
var regx = /^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*$/;
return regx.test(value);
break;
case "userid" :
case "user_id" :
var regx = /^[a-zA-Z]+([_0-9a-zA-Z]+)*$/;
return regx.test(value);
break;
case "homepage" :
var regx = /^(http|https|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/;
return regx.test(value);
break;
case "korean" :
var regx = /^[가-힣]*$/;
return regx.test(value);
break;
case "korean_number" :
var regx = /^[가-힣0-9]*$/;
return regx.test(value);
break;
case "alpha" :
var regx = /^[a-zA-Z]*$/;
return regx.test(value);
break;
case "alpha_number" :
var regx = /^[a-zA-Z][a-zA-Z0-9\_]*$/;
return regx.test(value);
break;
case "number" :
return !isNaN(value);
break;
case "jumin" :
return juminChk(value);
break;
case "jumin2" :
return juminChk2(value);
break;
}
return null;
}
- line 203 ~ 247
function juminChk(val) {
var total = 0;
var sval;
for(i=0;i<13;i++) {
sval = val.substr(i, 1);
if(i < 8) {
total = total + (sval * (i + 2));
}
if(i > 7 && i < 12) {
total = total + (sval * (i - 6));
}
}
total = total % 11;
var total2 = 11 - total;
if(total2 > 9) total = total2 % 10;
total = val.charAt(12);
if(total == total2) return true;
else return false;
}
function juminChk2(val) {
var sum = 0;
var odd = 0;
var buf = new Array(13);
for(i=0;i<13;i++) buf[i] = parseInt(reg_no.charAt(i));
odd = buf[7] * 10 + buf[8];
if(odd % 2 != 0) {
return false;
}
if((buf[11] != 6) && (buf[11] != 7) && (buf[11] != 8) && (buf[11] != 9)) {
return false;
}
var multipliers = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];
for(i=0,sum=0;i<12;i++) sum += (buf[i] *= multipliers[i]);
sum = 11 - (sum % 11);
if(sum >= 10) sum -= 10;
sum += 2;
if(sum >= 10) sum -= 10;
if(sum != buf[12]) {
return false;
} else {
return true;
}
}
- line 306 ~ 310
function XmlJsFilterCheckFieldItem() {
for(var i=0; i<extra_vars.length;i++) {
var name = extra_vars[i];
this.addFieldItem(name, false, 0, 0, "", "");
}
for(var i=0; i<this.field.length;i++) {
var item = this.field[i];
var target = item[0];
var required = item[1];
var minlength = item[2];
var maxlength = item[3];
var equalto = item[4];
var filter = item[5].split(",");
if(typeof(this.fo_obj[target])=='undefined') continue;
for(var j=0; j<notnull_list.length; j++) {
if(notnull_list[j]==target) required = true;
}
var value = this.getValue(target);
if(!required && !value) continue;
if(required && !value && this.fo_obj[target]) return this.alertMsg(target,'isnull');
if(minlength>0 && maxlength>0 && (value.length < minlength || value.length > maxlength)) return this.alertMsg(target, 'outofrange', minlength, maxlength);
if(equalto) {
var equalto_value = this.getValue(equalto);
if(equalto_value != value) return this.alertMsg(target, 'equalto');
}
if(filter.length && filter[0]) {
for(var j=0;j<filter.length;j++) {
var filter_item = filter[j];
if(filter_item == 'jumin') {
if(document.getElementById(filter_item).form.foreigner.checked == true){
filter_item = 'jumin2';
}
}
if(!this.executeFilter(filter_item, value)) return this.alertMsg(target, "invalid_"+filter_item);
}
}
}
return true;
}
//외국인 번호를 체크하실게 아니면 역시 jumin2 관련 된 부분은 삭제 가능합니다.
/// CONAN 의 삭제 요청에 삭제 대신 관련 설명을 추가하도록 하겠습니다.
아래 13번 항목은 관리자 페이지에서 주민등록 번호를 출력하는 부분이며
14번 항목은 개인정보 항목에서 주민등록 번호를 출력하는 부분입니다.
개인적으로는 뒷자리를 1****** 으로 표시하여 사용하고 있습니다만.
다른 사용자가 주민등록번호를 보는것을 원치 않으실 경우 아래 항목은 적용하지 마시길 바랍니다.
{substr($member_info->jumin, 0, 6)} - {substr($member_info->jumin, 6, 1)}******
위와 같이 적용할 경우 890123-1****** 형식으로 출력됩니다.
아래 13,14 항목을 적용하지 않으셔도 사용상에 문제는 발생하지 않습니다.
13. /xe/modules/member/tpl/member_info.html
- line 97 ~ 100
<tr>
<th scope="row"><div>{$lang->jumin}</div></th>
<td>{substr($member_info->jumin, 0, 6)} - {substr($member_info->jumin, 6, 7)}</td>
</tr>
14. /xe/modules/member/skins/default/member_info.html
- line 37 ~ 40
<tr>
<th><div>{$lang->jumin}</div></th>
<td>{substr($member_info->jumin, 0, 6)} - {substr($member_info->jumin, 6, 7)}</td>
</tr>
15. /xe/modules/member/member.admin.model.php // 관리자 페이지에서 주민등록번호로 검사
- line 74 ~ 76
/**
* @brief 회원 목록을 구함
**/
function getMemberList() {
// 검색 옵션 정리
$args->is_admin = Context::get('is_admin')=='Y'?'Y':'';
$args->is_denied = Context::get('is_denied')=='Y'?'Y':'';
$args->selected_group_srl = Context::get('selected_group_srl');
$search_target = trim(Context::get('search_target'));
$search_keyword = trim(Context::get('search_keyword'));
if($search_target && $search_keyword) {
switch($search_target) {
case 'user_id' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
$args->s_user_id = $search_keyword;
break;
case 'user_name' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
$args->s_user_name = $search_keyword;
break;
case 'nick_name' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
$args->s_nick_name = $search_keyword;
break;
case 'email_address' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
$args->s_email_address = $search_keyword;
break;
case 'regdate' :
$args->s_regdate = ereg_replace("[^0-9]","",$search_keyword);
break;
case 'regdate_more' :
$args->s_regdate_more = substr(ereg_replace("[^0-9]","",$search_keyword) . '00000000000000',0,14);
break;
case 'regdate_less' :
$args->s_regdate_less = substr(ereg_replace("[^0-9]","",$search_keyword) . '00000000000000',0,14);
break;
case 'last_login' :
$args->s_last_login = $search_keyword;
break;
case 'last_login_more'+
' :
$args->s_last_login_more = substr(ereg_replace("[^0-9]","",$search_keyword) . '+
'00000000000000',0,14);
break;
case 'last_login_less' :
$args->s_last_login_less = substr(ereg_replace("[^0-9]","",$search_keyword) . '00000000000000',0,14);
break;
case 'extra_vars' :
$args->s_extra_vars = ereg_replace("[^0-9]","",$search_keyword);
break;
case 'jumin' : // 검색대상이 jumin 이면..
$args->s_jumin = ereg_replace("[^0-9]","",$search_keyword);
break;
}
}
// selected_group_srl이 있으면 query id를 변경 (table join때문에)
if($args->selected_group_srl) {
$query_id = 'member.getMemberListWithinGroup';
$args->sort_index = "member.member_srl";
} else {
$query_id = 'member.getMemberList';
$args->sort_index = "member_srl";
}
// 기타 변수들 정리
$args->page = Context::get('page'+
');
$args->list_count = 40;
$args->page_count = 10;
return executeQuery($query_id, $args);
}
16 . /xe/modules/member/quries/getMemberList.xml
- line 16
<query id="getMemberList" action="select">
<tables>
<table name="member" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="is_admin" var="is_admin" />
<condition operation="equal" column="denied" var="is_denied" pipe="and" />
<group pipe="and">
<condition operation="like" column="user_id" var="s_user_id" />
<condition operation="like" column="user_name" var="s_user_name" pipe="or" />
<condition operation="like" column="nick_name" var="s_nick_name" pipe="or" />
<condition operation="like" column="email_address" var="s_email_address" pipe="or" />
<condition operation="like" column="jumin" var="s_jumin" pipe="or" />
<condition operation="like" column="extra_vars" var="s_extra_vars" pipe="or" />
<condition operation="like_prefix" column="regdate" var="s_regdate" pipe="or" />
<condition operation="like_prefix" column="last_login" var="s_last_login" pipe="or" />
<condition operation="more" column="member.regdate" var="s_regdate_more" pipe="or" />
<condition operation="less" column="member.regdate" var="s_regdate_less" pipe="or" />
<condition operation="more" column="member.last_login" var="s_last_login_more" pipe="or" />
<condition operation="less" column="member.last_login" var="s_last_login_less" pipe="or" />
</group>
</conditions>
<navigation>
<index var="sort_index" default="member_srl" order="desc" />
<list_count var="list_count" default="20" />
<page_count var="page_count" default="10" />
<page var="page" default="1" />
</navigation>
</query>
추가로 첨부파일에 /xe/modules/member/ 폴더를 압축한 파일 첨부 합니다.
- 위 내용은 주민등록 번호가 필수 입력 사항이 아닙니다.
// 덧 : 이거 하느라 하느 업무의 반을 날려먹었군요 ㅎㅎ 오늘 좀 여유가 있어서 정리해봅니다.
그 동안 제가 올린 주민등록번호 입력 폼 게시물을 보고 고생 하셨던 분들에게 좀 더 도움이 되시길 바랍니다.
** 첨부 파일을 다운 받으시는 분들은
** 아래 항목은 관리자 페이지에서 회원의 주민등록 번호를 볼수 있는 기능이니 보안관련 문제가 발생 할수 있습니다.
아래 내용을 적용하지 않으셔도 사용에 문제는 발생하지 않습니다.
13. /xe/modules/member/tpl/member_info.html
- line 97 ~ 100
<tr>
<th scope="row"><div>{$lang->jumin}</div></th>
<td>{substr($member_info->jumin, 0, 6)} - {substr($member_info->jumin, 6, 7)}</td>
</tr>
첨부 파일 중 위 소스를 확인 하여 꼭 수정해 주세요 첨부 파일에 $ 기호가 누락되어있습니다.
- [2009/02/16] 웹마스터 팁 주민등록번호 입력 폼 추가 (1.1.5 기준) *39
댓글 55
-
YO-DA
2009.04.10 18:16
-
하하 결국 또 올려주셨군요...고생 많으셨습니다.XE 버전이 올라갈때마다 변경사항에 멤버 관련 소스들이 있나 제일 먼저 확인합니다..ㅎㅎ 방법을 강구하던지 해야지..불안해서요..^^
-
뽀칠이
2009.04.11 07:03
확장변수에는 적용하기 힘들까요? 가능하면 좋을것인데요.; 그래도 정말 수고하셨습니다. -
터구
2009.04.11 10:10
Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /home/hosting_users/XXXXX/www/classes/template/TemplateHandler.class.php(441) : eval()'d code on line 43
이제 무슨 내용일가요..
새로고침 하면 백지창이 나옵니다만..^^ -
개돌
2009.04.14 09:01
저도 오류창 나오면 무섭습니다 ㅠ.ㅠ T_OBJECT 어쩌고 나오는거 보니 ..
소스 중에 오류창 띄우는 new Object(어쩌고..) 이 부분 근처에 오류가 있는게 아닌가 싶네요.
return new Object() 는 형식검사와 중복검사 부분에 있습니다. -
꼭 위 둘 프로그램 중에 하나를 써야 하나요?
호스팅 업체를 사용하는데 어떤 것을 써야하는지... ㅡㅡ;
왕초보라 그런데 자세히 좀 설명 부탁드려요;; -
개돌
2009.04.15 10:32
호스팅 업체에서 제공해주는 DBTool이 없다면 아마 phpmyAdmin을 사용하셔야 될 겁니다.
phpmyadmin 외에 다른 웹툴은 제가 잘 모르겠네요.
예전에 서버 직접 관리를 못할땐 phpMyAdmin을 사용하다가 서버 접속권한이 생긴 이후로 navicat을 사용하고 있거든요...
phpmyadmin 을 검색사이트에서 검색해보시면 사용법 같은게 자세히 나온 블로그나 카페가 많을 겁니다. -
웹호스팅 회사에서 phpmyadmin 2.8.2 를 사용하던데 여기 추가 부분을 설명해주시면 감사하겠습니다.
왕초보라 건들기가 좀 그래서요;;;
부탁 좀 드리겠습니다.
-
개돌
2009.04.17 08:48
phpmyadmin 으로 접속해보시면
왼쪽에 데이터베이스 리스트가 있습니다.
그중 XE가 설치된 데이터 베이슬르 선택하시면 테이블 리스트가 나옵니다.
그 테이블 리스트 중 XE_MEMBER 테이블을 선택하시고.
오른쪽 화면의 최 하단에 필드 추가 하는 폼이 있던걸로 기억합니다.(phpmyadmin을 안쓴지 2년쯤 되서 ....)
그곳에
필드명 jumin
형식 char
크기 13
으로 필드를 추가해 주시면 됩니다.
-
nonoboy
2009.04.18 22:27
고맙습니다 한큐에 잘되더군요
부가적으로 성인가입만 되게 부탁하려 했는데
걍 유료로 함 달아보려 합니다 ^^
암튼 잘쓰고 있습니다. 설명이 잘돼어있어 라인 감 잡기가 훨신 수월해 졌습니다
-
btf
2009.04.19 01:03
주민등록번호를 필수항목으로할려면 어떻게해야합니까?
-
개돌
2009.04.20 08:37
제가 살펴본 바로는 대충 아래와 같은 부분을 체크 해주시면 될 것 같습니다만.
실제로 지금 테스트를 해볼 수 있는 상황은 아니라 테스트는 못해봤습니다.
첫번째 항목의 notnull 만 붙여줘도 사실상 빈칸이면 DB오류로 가입이 안될 것이지만 오류 메시지가 가입자에게 보이지 않으므로
아래 추가된 부분들을 통해 메시지가 표시될 것입니다.4. /xe/modules/member/queries/insertMember.xml
<column name="jumin" var="jumin" notnull="notnull" /> //notnull 추가 , notnull은 빈 데이터를 허용하지 않는 다는 뜻으로 보심 됩니다.11. /xe/modules/member/member.model.php
- line 270 ~ 321
/**
* @brief 주민등록번호 형식 확인
**/
function isTrueNumber($jumin){
if($jumin=='') return false; // $jumin 이 없으면 그냥 오류 표시 즉 빈칸이면 오류
$total = 0;
for($i=0;$i<13;$i++){
$sval = substr($jumin, $i, 1);
if($i < 8){
$total = $total + ($sval * ($i+2));
}
if($i > 7 && $i < 12){
$total = $total + ($sval * ($i-6));
}
}
$total = $total % 11;
$total2 = 11 - $total;
if($total2 > 9) $total2 = $total2 % 10;
$total = substr($jumin, 12, 1);
if($total == $total2) return true;
else return false;
}12. /xe/common/js/xml-js_filter.js
- line 203 ~ 247
function juminChk(val) {
if(val=='') return false; //val이 없으면 오류 표시 , 즉빈칸이면 오류 표시
var total = 0;
var sval;
for(i=0;i<13;i++) {
sval = val.substr(i, 1);
if(i < 8) {
total = total + (sval * (i + 2));
}
if(i > 7 && i < 12) {
total = total + (sval * (i - 6));
}
}
total = total % 11;
var total2 = 11 - total;
if(total2 > 9) total = total2 % 10;
total = val.charAt(12);
if(total == total2) return true;
else return false;
} -
YO-DA
2009.07.20 19:07
개돌님 위와 같이 1.2.4에서 테스트 하여 보았는데 아무런 문제 없네요^^
-
이재명956
2009.05.07 14:46
1.2.2에서는안 먹히는건지...
그대로 따라했는데 회원 가입이 안되는군요...
-
개돌
2009.05.11 09:36
죄송하게도 1.2.2 로 업그레이드 예정이 없습니다 .ㅠㅠ
추후 좀 더 상위 버젼에서 제가 원하는 기능들의 패치가 이루어진 버젼에서 업그레이드 할 예정이라 그 전에는 손대기가 좀 애매 하네요 -
도파돌이
2009.05.14 17:21
좋은 정보 고맙습니다. 1.2.2에 업그레이드 계획이 없다고 하셔서...
제가 1.2.2에서 적용을 해보려고 코드를 확인해가면서 수정작업을 하였습니다.
근데 다음과 같은 메시지가 나오면서 오류가 뜨네요.
Parse error: parse error in C:\APM_Setup\htdocs\xe\classes\template\TemplateHandler.class.php(446) : eval()'+ 'd code on line 47
코드를 계속 봤는데.. 아직까지는 모르겠네요...
음... -
도파돌이
2009.05.15 16:37
1.2.0에서도 동작하지 않네요. 1.2.0 Full 버젼에 개돌님께서 첨부하신 것을 다운받은 후 덮어 쓰기 했는데요.
Parse error: parse error in C:\APM_Setup\htdocs\xe\classes\template\TemplateHandler.class.php(441) : eval()'d code on line 43 가 뜹니다.
음... 어렵네요.. 누락된 파일이라도 있는 건가요?
-
♡不明♡
2009.05.15 21:53
전 1.2.2 인데 위처럼 수작업으로 소스코드 입력후 정상 작동 하네요^^
문제는 암호화 되서 들어 가지 않는 단점이 -0- -
도파돌이
2009.05.15 22:01
그래요? 음... 밀고 다시해보고 그랬는데.. 저는 VMWARE상에서 Win XP에 APM 최신 버젼으로 설치한 후, XE설치하고 테스트를 했어요. 이상하네요. 음... 그리고 암호화 되지 않는다는게 주민번호가 보인다는 말씀이겠네요...
3일째 고민했는데... 쩝.. 그래도 일단 되신 분이 계시니... 희망을 가져 봅니다.
-
♡不明♡
2009.05.15 22:28
제가 보니까 자기 아이디에서 정보 보기 할때 저도 오류 나네요..!!
Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /home/hosting_users/toslay/www/zbxe/classes/template/TemplateHandler.class.php(446) : eval()'d code on line 43
이렇게 오류 나요...나머지는 다 잘되는거 같습니다 ^^ 그래서 결국은 롤백 시켰어요
-
도파돌이
2009.05.16 09:59
제가 미처 그부분은 말씀을 못 드렸네요. 정보보기 했을 때 나타났어요. 현재까지는 1.2.2제가 개돌님 소스를 참고해서 변형한 것) 그리고 1.2.0(개돌님 소스 사용)에서 내 정보보기에서 발생했어요. 1.2.2는 그렇다치더라도 1.2.0에서도 문제가 있어서.. php나 mysql 등 설치 된 리소스 버젼 때문인지... 계속 고민을 하고 있습니다. 우선 1.2.0에서 제대로 동작하시는 분 계시면 설치 버젼(php, mysql, apache 등등) 좀 알려주세요. 저는 테스트용으로 제 컴에 APMSETUP6_2009021700(http://www.apmsetup.com/)를 설치했습니다.
Apache 2.2.11 (openssl 0.9.8i) [ http://httpd.apache.org ]
- Server\Apache
PHP 5.2.8 [ http://kr.php.net ]
- Server\PHP5
Zend Optimizer v3.3.3 [ http://www.zend.com ]
- Server\ZendOptimizer
MySQL 5.0.67 [ http://www.mysql.com ]
- Server\MySQL5
phpMyAdmin 3.0.1.1 [ http://www.phpmyadmin.net ]
- Server\phpMyAdmin -
도파돌이
2009.05.16 10:44
최신 버젼으로 APMSETUP6_2009041200.exe 을 다시 받아서 설치하고 다시 적용했습니다. 1.2.0에서 오류는 없어졌는데.. 가입시 주민번호를 입력하면 주민번호가 잘못되었다고 나오네요... 13자리 입력인데.. 음.. 더 테스트를 해보겠습니다.
Apache 2.2.11 (openssl 0.9.8i) [ http://httpd.apache.org ]
- Server\Apache
PHP 5.2.9-2 [ http://kr.php.net ]
- Server\PHP5
Zend Optimizer v3.3.3 [ http://www.zend.com ]
- Server\ZendOptimizer
MySQL 5.0.77 [ http://www.mysql.com ]
- Server\MySQL5
phpMyAdmin 3.1.3.1 [ http://www.phpmyadmin.net ]
- Server\phpMyAdminCUBRID / JRE
- 배포 최신 버전 -
도파돌이
2009.05.17 13:05
1.2.0에서 테스트한 결과입니다.
회원정보보기하면 다음과 같은 메세지가 나옵니다.
Parse error: parse error in C:\APM_Setup\htdocs\xe\classes\template\TemplateHandler.class.php(441) : eval()'d code on line 43
그리고 신규 가입시 주민번호 입력 항목이 나타나지만 입력을 하면 잘못되었다고 하네요.
문제의 원인을 아시는 분 있으시면 알려주세요. 아니면 1.2.0에서 잘 쓰시는 분 계시면 설치버젼을 알려주세요.
-
개돌
2009.05.18 14:01
도파돌이님 ♡不明♡ 님 우선 불편을 드려서 죄송합니다.
우선 회원 가입 시 잘못 된 주민등록 번호 입니다.
라고 뜨는 부분은 제가 다시 해보니 스크립트의 띄어 쓰기 문제 인듯 합니다.
이게 되는 분도 있고 안되는 분도 있는듯 한데요./common/gs/xml_js_filter.js 의 함수를 아래 소스로 바꿔보세요
function juminChk(val) {
var total = 0;
var sval;
for(i=0;i<13;i++){
sval = val.substr(i,1);
if(i<8) {
total = total + (sval*(i+2));
}
if(i>7 && i < 12) {
total = total + (sval*(i-6));
}
}
total = total%11;
var total2 = 11-total;
if(total2>9) total2 = total2 % 10;
total = val.charAt(12);if(total == total2) return true;
else return false;
}다른 점은 계산 식을 (i + 2) 식으로 띄어쓰기 한것을 (i+2) 식으로 붙인 것 뿐입니다.
그런데 이거 만으로 오류가 해결 되네요;; 다른 점은 이거밖에 없는데 ㅠ.ㅠ
**************또한 이부분은 제 오타로 인해 발생한 문제로 대단히 죄송합니다. ***************
<tr>
<th><div> {lang->jumin}</div></th>
<td>{substr($member_info->jumin, 0, 6)} - {substr($member_info->jumin, 6, 7)}</td>
</tr>{$lang->jumin} $ 기호를 하나 빼먹었습니다 ㅠ.ㅠ
이거 수정해 주시면 될거에요 죄송합니다.
-
♡不明♡
2009.05.19 23:33
불편은 무슨 불편이에요 ^^
세심한 배려에 그저 감사 드릴뿐이죠..
-
개돌
2009.05.18 14:10
Parse error: syntax error, unexpected T_OBJECT_OPERATOR in www/classes/template/TemplateHandler.class.php(441) : eval()'d code on line 43
위 에러가 나던 분들께 죄송하다는 말씀 드립니다.
오탈자 확인을 제대로 못해서 불편을 드렸네요.바로 위에 댓글에 적어 드린 것처럼 $ 기호 하나 빠진게 원인이었습니다.
확인 후 수정해 주시면 해결 될겁니다.
// ps : 보통 회사에서만 웹 사이트들을 돌아다니고 집에서는 거의 게임만 하고 삽니다 ㅡㅡ;;
주로 주말에는 웹 사이트들을 거의 안보는 편이라 쪽지를 받고도 월요일인 오늘에서야 확인 했네요
정보를 얻어가기 위해 평일에는 거의 매일 접속하는 편이니 문제가 있는 경우 언제든 쪽지 주세요 (__) -
도파돌이
2009.05.18 15:41
개돌님 고맙습니다. 1.2.0에서 문제가 해결되네요.
현재 1.2.2로 시도하고 있어요. 적용 결과 문제가 있네요. 회원가입을 하면 필수항목 입력 후 주민등록번호 도 넣고서 등록을 하면 빠져나가버립니다.
주소창에는 http://주소/xe/?mid=home&user_id=아이디&password1=암호&password2=암호&user_name=이름&nick_name=닉네임&email_address=이메일주소&jumin=주민등록번호&allow_mailing=Y&act=dispMemberSignUpForm 형태로 나오면서 초기화면으로 가 버려요.
-
개돌
2009.05.20 15:47
말씀하신 거랑 같은 현상을 다른 부분 개발 연동하다 발견한 적이 있었는데요. 저는 조금 무식하게 입력 폼을 하나씩 제거하면서 오류가 나는 입력폼을 찾았던 것으로 기억합니다.
당시 핸드폰 인증 기능 연동하면서 발생한 오류였고 핸드폰 인증을 위해 팝업에서 데이터를 받아올때 발생한 문제였는데요.
아마 Ajax를 통해 데이터를 입력 받으면서 발생하는 문제는 아닐까 싶네요. -
도파돌이
2009.05.20 18:03
입력 폼을 하나씩 제거한다는 말씀이 어떤 의미인가요?
예를 들어서, 아이디, 비밀번호, 이름, 닉네임 등 회원가입시 입력항목이 있다면 닉네임을 지워서 테스트 한다는 뜻인가요?
있는지는 모르겠지만 만약 있다면 디버깅 툴을 소개 받았으면 하네요.
-
개돌
2009.05.21 09:54
저도 디버깅툴을 쓰면 좋겟지만 사용법도 잘 모르겠고 거의 수작업으로 합니다 ㅠ.ㅠ
의심가는 소스 부분을 삭제 혹은 주석 처리 하면서 확인을 하던가
아니면 모든 소스를 지우고 하나씩 하나씩 복구해가면서 오류가발생하는 부분을 찾는 식으로 오류를 찾고 수정합니다.
XE의 경우 model, controller, view 파일에 다른 모듈과 연동되기도 하고 js 파일도 있고 저같이 수동 디버깅을 하는게 쉽지는 않지만 그래도 결국 문제의 해결점은 찾게 되더라고요 ^^;;
-
도파돌이
2009.05.21 16:37
ㅠㅠ.. 전체 흐름이 파악되지 않는 상태에서 디버깅은 불가능한 것 같네요. 이것저것 해보는데.. .. 넘 어렵군요.
-
개돌
2009.05.21 17:45
도파돌이님 혹시 가능하시면 /modules/member/ 하위 소스만 올려줘보세요.
다운받아서 한번 테스트 해보겠습니다. -
도파돌이
2009.05.21 17:58
/modules/memeber, /common/js, /common/lang 에서 개돌님께서 설명 남겨주신 것을 모두 적용시켰습니다.
가입시.. 필수 입력사항을 입력하고 주민번호 입력한 후 가입을 누르면 기본페이지로 넘어가 버려요.
1.2.2 기본에 1.2.2 긴급패치가 적용된 상태에요. 주민번호 소스 입장에서 보면 차이가 없어요.
소스를 지워가면서도 해보고, firebug, firephp를 이용해서 시도도 해보고 하는데.. 아직 답은 얻지 못했어요.
한 수 지도 부탁드려요...
-
도파돌이
2009.05.22 16:03
1.2.2에서 보면.. 안된 원인을 찾은 것 같네요.
/common/js/xml_js_filter.js
추가된 부분..
if(filter_item == 'jumin') {
if(document.getElementById(filter_item).form.foreigner.checked == true){
filter_item == 'jumin2';
}
}이 부분을 주석 처리하면 정상 동작을 하네요. 개돌님 확인 부탁드려요.
위의 주석처리하여 1.2.2에 적용한 코드를 첨부합니다.
-
도파돌이
2009.05.24 16:04
충돌 일으키는 부분이
/common/js/xml_js_filter.js
if(filter_item == 'jumin') {
빨간색으로 표시한 부분이 등호 2개(==)가 아닌 1개(=)가 맞는 것 같은데요. 이것만으로는 해결이 안되는 군요..
if(document.getElementById(filter_item).form.foreigner.checked == true){
filter_item == 'jumin2';
}
} -
개돌
2009.05.25 11:45
우선 말씀해 주신 == 기호는 = 가 맞구요
오류를 찾았습니다 .-_-;
우선 오류 해결 단계를 정리해 보자면
if(filter_item=='jumin') 소스 아래
alert(filter_item) 과 alert(document.getElementById(filter_item).form) 을 해본결과 두번째 결과에서 오류가 났습니다.
해당 form 을 찾지 못한다는 결론에 alert(document.getElementById(filter_item)) 로 수정하자 null 값이 리턴되더군요.즉 실제 원인은 document.getElementById('jumin') 을 찾아야 되는데 이 jumin 필드를 찾지 못하는 문제 였습니다.
signup_form.html 의 jumin 입력 폼에 name="jumin" id="jumin" 으로 해주시면 해결됩니다.
-
도파돌이
2009.05.25 12:30
와우...
적용을 했고 이제 잘 됩니다. 고맙습니다.
-
YO-DA
2009.07.09 11:01
주민번호입력 1.2.4용에 목숨걸고 애타게 기타리는 한 사람입니다^^
1.1.5에서 1.2.4로 선뜻 못가는 이 사람 개돌님의 자료를 타는 목마름으로 기다리고 있습니다^^
-
YO-DA
2009.07.09 13:55
허걱! 비가 내리는 가운데 시간이 나길래 아침부터 차근히 시도하여 본 결과 1.2.4에서도 되는군요^^
단 한 방에 끝냈습니다^^
13. /xe/modules/member/tpl/member_info.html
- line 97 ~ 100
<tr>
<th scope="row"><div>{$lang->juimn}</div></th>
<td>{substr($member_info->jumin, 0, 6)} - {substr($member_info->jumin, 6, 7)}</td>
</tr>juimn을 jumin으로 고치시기 바랍니다^^
-
개돌
2009.07.15 11:23
제가 워낙에 오타 쟁이다 보니 죄송합니다 ㅠ.ㅠ
오타 습관을 고쳐야 되는데 쉽지 않네요;;
고생하셨습니다.
-
CONAN
2009.07.10 15:16
파일 받지 않고 위의 방법대로 손으로 직접 소스 추가하고 수정하면 1.2.4 버전에서 됩니다!
▲ 또한 바로 위의 YO-DA 님이 지적해 주신대로 오타 수정하시구요,
**다만 다른회원분들이 회원정보 보기로 손쉽게 다른사람의 주민등록번호를 볼 수 있습니다.
'+ '개돌'님께서 왜 그러신지 모르겠지만 다른 회원들이 회원정보보기 기능으로 다른사람의 가입시 주민등록번호를 볼 수 있게
되어서 주민등록번호가 무방비로 완전 노출됩니다. 회원정보보기 기능으로 아주쉽게 다른사람의 주민등록번호가 보입니다.
따라서 회원정보보기 페이지에 추가되는 소스인
13. /xe/modules/member/tpl/member_info.html
14. /xe/modules/member/skins/default/member_info.html의 작업을 생략하시면 회원정보보기로 주민등록번호가 뜨지 않습니다.
** 개돌님께 13번 14번 작업을 삭제해 주셨으면 합니다. 주민번호가 무방비로 딴 회원분들에게 노출이 되네요.
-
개돌
2009.07.15 11:20
개인적으로는 1****** 으로 사용하거나 표시 하지 않도록 사용하고 있습니다만
우선 CONAN님의 지적에 따라 관련 내용에 대한 부가 설명을 추가하였습니다.
관련 내용 지적 감사합니다.
-
글쓴이
2009.07.15 17:23
invalid_jumin 이런 오류가 나네요
직접와서 보세요 회원가입해보셔요
문제점 해결후 디비 jumin 추가는했는데 그거 오류인가는 모르겟고
추가안했을때도 떻던거라
뭐 그런지는모르겠지만
-
티하이
2009.07.14 23:19
invalid_jumin 이런 오류가 나네요
직접와서 보세요 회원가입해보셔요
문제점 해결후 디비 jumin 추가는했는데 그거 오류인가는 모르겟고
추가안했을때도 떻던거라
뭐 그런지는모르겠지만
-
개돌
2009.07.16 14:27
8. /xe/common/lang/ko.lang.php
- line 89
$lang->jumin = '주민등록번호';
- line 299
$lang->filter->invalid_jumin = '잘못된 %s 형식입니다.';내용중 이런부분이 있습니다.
line 299의 잘못된 주민등록번호 형식입니다. 라는 오류창을 띄워주는 텍스트가 제대로 입력이 안된게 아닌가 싶네요.
오류 내용은 잘못된 주민등록번호형식입니다. 라는 오류입니다.
-
YO-DA
2009.07.20 11:05
먼저 개돌님께 주민등록 입력 폼을 이용하게 해주셔서 감사드립니다^^
주민등록 입력이 필요한 홈페이지가 아직도 상당히 있습니다.
추세와 더불어 개인정보 보호 차원에서 요즘 주민증록 입력 자체가 안되게 소스가 짜여져 있지만
어쩝니까^^ 저같은 경우 아파트 홈페이지를 다루기 때문에 주민등록이 반드시 필요하더라구요^^
하여 다음 버전에는 아예 기본 정보에서 주민등록 입력 소스를 추가하고 그것을 사용,미사용을 선택하게 하여
주었으면 하는 바람이 있습니다.
오늘 제가 이야기 하고 싶은 것은 어쩌면 저만의 문제일지도 모르지만 많은 유저들께서
한 번 테스트 해보셨으면 하는 것이 있기에 글 써 봅니다.
1. 주민증록 입력 폼을 구축하였습니다. 아주 잘 사용하고 있지요^^. 1.2.4입니다.
아파트 홈페이지이기에 나이 많으신 분들은 생일 입력, 주소 입력 등에 어려움을 겪고 있고
실입주자인지 아닌지를 판단하기 위해서는 반드시 주민등록 입력 폼 등이 필요합니다.
저는 주민번호(jumin) 외에 동,호수(dongho) 등을 기본 정보에 추가하여 사용하고 있습니다.
2. 그런데 말입니다. 본문 아래의 이 댓글을...을 클릭하여 "스크랩"을 누르면 에러가 생깁니다.
UnKnown column "jumin" in "fieldlist'라고 에러 메시지 창이 떠 오릅니다.
하여 xe_member_scrap 에
jumin 필드
dongho 필드를 xe_member와 똑같이 만들어 주었더니 에러가 사라졌습니다.
3. 유저분들도 "스크랩"을 테스트 해보셔서 저와 같이 에러 메시지가 떠 오른다면
2 항과 같이 해 보시기 바랍니다.
즉, xe_member_scrap 에 jumin 필드를 추가하여 다시 체스트 하여 보십시오^^
4. 그 결과를 알려 주시면 다른 분들도 참고가 될 것으로 생각합니다^^
5. 또 하나 있습니다.
관리자 페이지에서 회원 정보 > 수정 으로 들어가서 이곳에서도 주민등록번호를 관리자가
수정하게 해 놓았습니다만^^
여기서는 주민번호의 진위 체크가 되질 않습니다.
이왕에 이곳에서도 진위 여부를 가능하게 해주셨으면 합니다.
처음에 주민등록번호를 입력받지 않게 설치를 하였는데 회원 수가 늘어남에 따라
제가 운영하는 홈페이지 특성 상 반드시 주민등록번호 입력을 받아야만 하겠기에 어쩔 수 없이
했지만 초기에 주민등록번호를 입력하지 않고 가입한 약 100여 명의 회원을 위해서는
관리자 페이지에서 수정하거나 입력해야만 하는 상황이 오겠되었습니다.
감사합니다.
-
개돌
2009.07.21 13:47
스크랩기능을 아예 사용하지 않다보니 몰랐네요.
또 애초에 실용적인 부분에 맞춰서 올릴걸 잘못했다라는 생각도 들기도합니다. ;ㅁ;
우선 주민등록번호는 한번 입력되면 다시는 수정할 일이 없기에 관리자페이지에서도 수정이 되면 안되는 항목이죠.
그래서 여기서는 주민등록번호가 수정되지 않는게 맞다고 생각합니다.
어쨋거나..좋은 태클 감사드립니다.
XE에서 기본적으로 지원해주면 좋겠네요 ㅠㅠ
-
YO-DA
2009.07.21 17:09
허걱! 태클이라니오 -.-
태클아닙니다^^ 아주 잘 사용하고 있고 항상 감사의 마음을 가지고 있는 한 사람입니다^^
관리자 페이지에서의 진위 여부 체크가 안된다면 별 수 없지요^^
진짜로 기본적으로 지원해 주었으면 좋겠어요^^
좋은 하루가 되시길...
-
CONAN
2009.07.29 20:24
회원가입을 하려는 손님 10명중 1-2명은 꼭 주민등록번호를 맞게 입력해도 잘못된 주민등록번호라고 나온다라며 항상 문의가 들어옵니다. 대부분의 회원가입을 하려는 손님들 중 주민등록번호를 입력한 손님분들은 무난하게 주민등록번호 검사를 통과하지만, 꼭 10명중 1-2명은 주민등록번호를 옳게 입력했는데도 불구하고 잘못된 주민등록번호라고 나온다고 합니다. 입력된 모든 주민등록번호를 잘못된 주민등록번호라고 하지 않는걸로 봐선 프로그램상 문제는 아닌 듯 싶습니다. 외국인에 체크를 해 보고 다시 시도해 보라고 해도 결과는 똑같다고 하네요..
몇몇 분들의 주민등록번호가 새로운 주민등록번호 법칙에 따라 바뀌게 생성된 것인가요? 기존과 다른 새로운 주민등록번호 법칙이라도 생겨난 것이 있나요~? 참 알다가도 모르겠습니다..
-
불패의초인
2009.08.31 10:04
CREATE TABLE `xe_member` (
jumin char(13) default NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
일케 해서 sql 파일로 만들어서 추가도 안되고 ㅠㅠ
미리내 쓰는데 거기 운영자한테 문의 해서 만들어 달라구했는데 추후에 오류나도 책임 안진다구 하니...........ㅠㅠㅠ
제목 | 글쓴이 | 날짜 |
---|---|---|
프로필이미지, 이미지마크, 이미지이름 수정, 추가시 포인트 삭감 [1] | lattente | 2009.11.02 |
제로보드4->XE 데이터 이전 시 회원 정보 오류 / 포인트 문제 [10] | 개돌 | 2009.10.08 |
추천과 추천포인트 관련 팁 [8] | 고진감래 | 2009.09.30 |
이미지마크 쓸 경우 레벨아이콘 위치 바꾸기 | 고진감래 | 2009.09.30 |
까오천사님의 만기일 팁을 1.2.4에 맞게 수정했어요.
[15]
![]() | 도파 | 2009.08.27 |
회원정보 손쉽게 엑셀 파일로 저장하기 [34] | thejeon | 2009.08.05 |
확장변수에 회원정보를 넣어보자
[10]
![]() | 개돌 | 2009.06.30 |
로그인 페이지 만드는 방법 [5] | 산토 | 2009.06.12 |
별도 페이지 로그인방법 | cornet | 2009.05.21 |
주민등록 입력 폼 1.2.0
[55]
![]() | 개돌 | 2009.04.10 |
클릭마다 조회수 올리기 [1.4.0]
[12]
![]() | 지B | 2009.04.04 |
제로보드의 아이콘을 내 맘대로 변경하기...(2)
[2]
![]() | winter548 | 2009.03.23 |
제로보드의 아이콘을 내 맘대로 변경하기...(1)
[3]
![]() | winter548 | 2009.03.23 |
테스트용 아이디 탈퇴 막기 [1] | SMaker | 2009.02.26 |
주민등록번호 입력 폼 추가 (1.1.5 기준) [39] | 개돌 | 2009.02.16 |
관리자 여러명 만들기 팁
[1]
![]() | 만쓰별(정만) | 2009.02.03 |
회원약관 추가
[7]
![]() | 애치티 | 2009.01.15 |
회원정보 이미지 항목 추가 [3] | 개돌 | 2008.12.22 |
[초간단]회원팝업메뉴에 메뉴넣기 [1] | Pw-NET | 2008.11.30 |
회원 관리 리스트에 생일/설명/활동량 추가하기
[16]
![]() | 老姜君 | 2008.11.21 |
아직 1.2.1 설치 안했지만 곧 설치할 때 아주 요긴하게 사용하겠습니다.
이전 것은 잘 사용하고 있습니다... 덕분이죠^^