포럼
회원 개인정보 수정 못하게 하기. 이름/생일/기타 추가항목
2013.07.04 14:00
1. 이름 수정 못하게 하는 방법은 아래 링크에서 보고 따라 했습니다.
2. 생일도 수정 못하게 하고 싶어서 방법을 찾아 봤는데, 검색은 실패했습니다.
그래서 1. 방법을 응용하였습니다.
모듈/멤버/member.admin.view.php 파일중
대략 465번째 줄근처에 아래 코드 비슷한게 있습니다.
else if($formInfo->name == 'birthday') $formTag->type = 'date'; $inputTag = sprintf('<input type="hidden" name="birthday" id="date_birthday" value="%s" /> <input type="text" placeholder="YYYY-MM-DD" name="birthday_ui" class="inputDate" id="birthday" value="%s" readonly="readonly" /> <input type="button" value="%s" class="btn dateRemover" />', $memberInfo['birthday'],zdate($memberInfo['birthday'], 'Y-m-d', false), $lang->cmd_delete);
위 코드의 위에 아래의 코드를 추가합니다.
(위 코드의 아래에 아래의 코드를 추가하면 안됩니다.)
else if($formInfo->name == 'birthday' && Context::get('logged_info') && Context::get('logged_info')->is_admin != 'Y') { $inputTag = sprintf('<input type="text" name="%s" value="%s" readonly="readonly" />', $formInfo->name, $memberInfo['birthday']); }
문제점 : 생일이 YYYY-MM-DD 꼴이 아니고 그냥 쭉 연속하여 표시됨. 어찌 바꾸는지 모르겠음
3. 그 외 추가로 입력받은 폼도 수정못하게 하려면
찾기로 //end isDefaultForm 를 찾아갑니다. (대략 520 라인?)
그 아래 이런 코드가 있는데...
$extendForm = $extend_form_list[$formInfo->member_join_form_srl]; $replace = array('column_name' => $extendForm->column_name, 'value' => $extendForm->value); $extentionReplace = array(); $formTag->type = $extendForm->column_type; if($extendForm->column_type == 'text') { $template = '<input type="text" name="%column_name%" id="%column_name%" value="%value%" />'; }
위 코드의 if 바로 위에 아래의 // // 사이 코드를 넣고 위 코드의 if를 else if 로 바꿔줍니다.
$formTag->type = $extendForm->column_type; // 회원정보에서 추가폼 입력 수정 못하게 --- if(($extendForm->column_name == ext_form1 || $extendForm->column_name == ext_form2) && Context::get('logged_info') && Context::get('logged_info')->is_admin != 'Y') { $template = '<input type="text" name="%column_name%" id="%column_name%" value="%value%" readonly="readonly" />'; } // --- 추가 종료 else if ($extendForm->column_type == 'text')
여기서는 ext_form1 과 ext_form2 라는 항목에 대해서 수정 못하도록 지정을 해 주었습니다.
(이름column_name은 관리자 페이지 가입폼 추가할 때 설정한 입력항목ID 입니다.)
더 추가하려면 ext_form2 뒤에 || 붙이고 더 추가하시면 되겠습니다.
4. 의문점
회원정보 수정 폼에서는 readonly가 적용되어 수정이 안되기는 하는데...
위조 페이지?를 만들어 해당 항목 값을 수정한 결과를 전송하는 등의 해킹이 가능한지는 잘 모르겠습니다.
등록 클릭했을 때 수정 못하게 한 항목값은 db에 입력하지 않거나,
기존 db값과 다른 값이 입력되었을 경우 에러 메시지를 띄운다거나 하는 코드가 있어야 할 것 같기도 합니다.
댓글 2
-
혼ME
2013.07.04 16:15
-
2-COIN
2013.07.05 08:45
처리부라고 하면 member.controller.php 이겠군요.
/**
** Modify member information
**/
여기를 손봐야 할 것 같네요. 감사합니다.
----------------------------------------------------------
이메일 수정해도 원래대로 바꾸는(=수정 못하게 하는) 팁이 있습니다.
http://www.xpressengine.com/tip/22109073
이걸 응용해서 수정하였습니다.
/modules/member/member.controller.php 2030 라인쯤에서
(// DB in the update 로 찾아가시면 됩니다)
// DB in the update if($args->password) $args->password = md5($args->password); else $args->password = $orgMemberInfo->password; // if(!$args->user_name) 유저이름도 변경 못하게 $args->user_name = $orgMemberInfo->user_name; // if(!$args->user_id) 유저id도 변경 못하게 $args->user_id = $orgMemberInfo->user_id; if(!$args->nick_name) $args->nick_name = $orgMemberInfo->nick_name; if(!$args->description) $args->description = ''; // if(!$args->birthday) 생일도 변경 못하게 $args->birthday = $orgMemberInfo->birthday;
위와 같이 수정하였습니다.
그런데... 추가 사용자 정의 폼은 어떻게 고정시켜야 할지... 더 연구해 봐야겠네요
* 문제점
이렇게 하니까 관리자도 수정을 못하는군요. (db를 직접 수정해야 함)
-------------------------
관리자는 수정할 수 있게 바꾸려면...
// DB in the update // 관리자 아니라도 변경 가능함 if($args->password) $args->password = md5($args->password); else $args->password = $orgMemberInfo->password; if(!$args->nick_name) $args->nick_name = $orgMemberInfo->nick_name; if(!$args->description) $args->description = ''; // 관리자가 아니면 변경 못함 if($logged_info->is_admin != 'Y') { $args->user_name = $orgMemberInfo->user_name; $args->birthday = $orgMemberInfo->birthday; $args->user_id = $orgMemberInfo->user_id; }
* 주의사항 :
원 코드는 그대로 두고 if($logged_info->is_admin != 'Y') { } 를 추가만 할지,
아니면 원 코드 부분을 없애고 교체할 지는 필요에 따라 선택해야 할 것 같습니다.
원 코드를 그대로 두면 관리자가 빈칸으로 (의도적 or 실수로) 수정을 할 수 없고,
원 코드를 없애고 위 추가 코드만 남기면 강제로 수정이 가능합니다.
view.php면 표시부라 패킷수정후 전송하면 가능합니다.
표시부 처리부 전부 수정해주셔야합니다.
그리고 표시부 수정은 되도록 스킨에서 하시는게 좋습니다.