CI 묻고 답하기

제목 md5 적용 중 코드 에러
글쓴이 gony 작성시각 2013/12/12 15:48:04
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 13289   RSS
 function bytexor($a,$b){
$c = "";
for($i=0;$i<16;$i++){
$c .= $a{$i}^$b{$i};
}
return $c;
}
 
function decrypt_md5($msg,$key){
$string = "";
$buffer = "";
$key2 = "";
while($msg){
$key2 = pack("H*",md5($key.$key2.$buffer));
$buffer = bytexor(substr($msg,0,16),$key2);
$string .= $buffer;
$msg=substr($msg,16);
}
return($string);
}

상위 코드에서 빨간 글자부분에서 에러가 발생합니다.
하지만 결과는 잘 받아옵니다.

CI를 적용하지 않은 PHP에서는 에러 없이 실행되는데,
CI를 적용한 페이지 에서는 에러를 발생합니다.(결과도 잘 받아옵니다.)


*에러내용---------------------------------------------------------------------------------------------------------------------------------------
A PHP Error was encountered

Severity: Notice

Message: Uninitialized string offset: 9

Filename: config/encryptFunc.dat

Line Number: 8 (빨간 글자 줄)

*에러내용---------------------------------------------------------------------------------------------------------------------------------------


왜이런 현상이 발생하는 걸까요 ?
 다음글 ci_session에서 $config['sess_tim... (3)
 이전글 모바일 페이지를 만들고 있는데요; (3)

댓글

gony / 2013/12/12 16:10:22 / 추천 0
 상단의 함수는 md5방식(키값을 이용)으로 암호화 / 복호화 하는 함수입니다.

늘 사용했습니다만, 결과도 정상적으로 나오는데 에러가 마구마구 뜨네요...
변종원(웅파) / 2013/12/12 18:20:58 / 추천 0
메세지에 답이 다 있는데요? 그리고 에러가 아니라 실행은 되는 notice입니다. Ci는 미리 선언하지않은 변수 사용하면 경고 뱉어냅니다. 메세지에 있는 config디렉에 았는 파일 열어보세요
letsgolee / 2013/12/13 12:55:46 / 추천 0
 Uninitialized string offset: 9 이란 에러는 주어진 스트링이 9글자일 가능성이 높네요. offset은 0부터 시작하니까요.

함수를 보면 $msg가 
substr($msg,0,16)에 의해 16자이내로 잘리는데 만일 $msg가 16자보다 못하게 되면 bytexor의 첫번째 파라미터 $a에는 16자가 되지 않는 스트링이 입력됩니다. 따라서 $a{$i}에서 $i가 스트링 길이 이상의 값을 갖게되면 스트링 offset을 넘기게 되는 notice에러가 뜨게 되죠. $b는 md5를 돌린 거니까 항상 16자 이상이 나옵니다.

해결하려면 
$a{$i}를 (isset($a{$i}) ? $a{$i} : null) 이런 식으로 변경하여야 합니다. null이 와야 할지 '' 혹은 0인지는 테스트해보고 결정하면 됩니다.