개발 Q&A

제목 외부에서 가져온 passowrd helper가져와서 쓰는데 잘 안되네요 ㅜㅜ
글쓴이 정수리 작성시각 2016/07/08 14:25:04
댓글 : 12 추천 : 0 스크랩 : 0 조회수 : 15200   RSS

회사내의 학습용 서버의  php 5.3.3  버전이기에 

 

github에 있는 password_compat 가져와서 사용하였습니다

 

윈도우 환경에서 회원가입시 비밀번호가 암호화되어 db에 잘들어 가지는데;

 

서버에 올린 후 회원가입을 하고 db를 확인해보니 비밀번호 값이 0으로 들어가버리네요;;

 

외부에서 가져온 helper는 로드되는것 같은데;; 함수가 안먹히는 건지;';

 

password_hash는 return 값이 false라고 알고 있는데

 

var_dump로 찍으면 false 돌아오긴하는데 실제 DB값에는 0이 들어가니 좀;; 당황스럽네요;;

 

passowrd_helper를 application/helpers에 넣어놨는데;;ㅜㅜ

 

저와 비슷한 상황 겪으신분이나 해결방법을 아시는분 계실까요ㅣ

 

 다음글 phpStorm 구매해 보고 싶은데 가격이랑 구매절차? (2)
 이전글 서버에 프로젝트를 올렸으나 css, script, im... (3)

댓글

정수리 / 2016/07/08 14:36:13 / 추천 0

찾아보니 ㅜ.ㅜ github에 있는 password_compat은 5.3.3 버전은 지원을 안하다고하네요 ㅜㅜ

 

제가 만들었던 윈도우환경에서 php7.0버전이였더라구요 ...

md5를 사용하는거 엄청 비추하던데;;

 

5.3.3버전에서 md5말고도 암호화하는 라이브러리가 같은게 있을까요?

/ 2016/07/08 14:40:55 / 추천 0

@정수리 우선적으로 확인할건 헬퍼에 있는걸 실행하는지 확인해보는것입니다. 가장 쉬운 방법은 함수를 하나 만들어보고 테스트페이지를 정해서 함수를 호출해보세요. 간단한 출력문 정도면 되겟죠? 이상이 없다면 회원가입페이지에서 사용하는 함수를 호출해보세요 호출이 된다면 어느 코드에서 동작하지 않는지 exit로 스크립트 종료해보면서 한줄식 실행해 보세요 더 쉽게 하는 법은 xdebug를 사용하는 법인데 설명하려면 좀 오래 걸려서 .. 어느부분에서 오류를 일으키는지 확인해 보시고 오류 일으키는 부분을 수정하시면 되겠죠? 아마도 제 생각엔 이 경우엔 로컬엔 설치된 php모듈을 라이브러리에서 사용하는데 실제 학습용 서버엔 모듈이 설치되어 있지 않거나 반대의 경우일것 같네요.

/ 2016/07/08 14:42:08 / 추천 0
kaido / 2016/07/08 14:53:23 / 추천 0

md5는 비추 정도가 아니라 개인정보보호법에 위반 됩니다.

또한 php의 오토캐스팅과 db의 타입형에 대해서 집고 넘어가셔야 합니다.

php의 연산자는

$a = 0;
$b = false;
$c = "";
$d = null;

if(!$a) echo "0 이지만 없습니다.";
if(!$b) echo "false 이지만 없습니다.";
if(!$c) echo " 공백이지만 없습니다.";
if(!$d) echo "null 이지만 없습니다.";

그리고 놀랍게도

if($a == null)
if($b == 0)
if($c == "")
if($d == false)

위 4개는 전부 해당 조건에 만족 합니다.
 php의 오토캐스팅은 null 0 "" false 그리고 bloo 에 대해서까지 전부 동일시 취급합니다.
더욱 정확한 비교를 위해서는 연산이 아닌 비교함수로 비교해야합니다.

더불어서 db 필드 종류에 따라서는 빈값을 공란이 아닌 0 으로 대체 하는 경우도 있습니다.
php에서 db로 넘길때 데이터 타입에 문제가 발생 할거 같으면  false 가 0 으로 캐스팅 될 수도 있습니다.
문자형이 0 으로 캐스팅 될 수도 있구요.

 

/ 2016/07/08 15:02:02 / 추천 0

@kaido 오토캐스팅이란 단어를 첨봐서 어 뭐지 했는데 의미를 추론하면 자료형을 알아서 런타임시 정해주는 걸 말하는거죠?? == <<는 비교연산자로 자료형은 비교하지 않고 비교하는 연산자고 자료형까지 비교하려면 === 연산자를 사용하면 되죠 .. 보통 kaido님은 자료형까지 비교하실때는 함수를 만들어 비교하시나봐요? 그 함수 궁굼한데 어떻게 사용하시나요 ?

정수리 / 2016/07/08 15:02:35 / 추천 0

@닉

답변감사합니다 

말씀하신 라이브러리를 사용할려고 하였는데 서버 php에는 Mcrypt 라이브러리가 설치가 안되었는지 Mcrypt 라이브러리가

필요하다는 에러출력되네요 ㅜㅜ 

제가 서버에서 사용하는 아이디는 관리자 아이디가 아니라서,, 설치도안되고 php.ini 수정도 안되네요 ㅜㅜ

다른것 없을까요..

정수리 / 2016/07/08 15:03:11 / 추천 0

@kaido

답변감사합니다..

아직 제가 많이 부족해서 그런지 정성있게 적어주신 글의 내용을 이해를 못하겠네요.., 죄송합니다.

/ 2016/07/08 15:36:14 / 추천 0

@정수리 전 제 서버를 사용하는지라 되도록 ci관련 라이브러리를 활용하는 편이라서(추후 유지보수를 생각했을시에 문서가 있는 ci라이브러리 사용이 유리한지라서..) 찾아봤는데 쓸만한게 안보이네요.. 논외지만.. 개발할때 로컬 개발환경과 서버 개발환경을 맞추는 작업은 중요합니다. 그리고 5.3.3버전은 php7에 비해서 속도가 느리다고 전해지네요 제가 벤치마크해본건 아니지만.. 사내 학습용 서버라고 하셨는데 무슨 목적인가요? 단순히 테스트서버 역활이라면 버전 업을 하는 방향이 좋아보여요... 그게 결정권이 없어 힘들다면, 라이브러리를 찾는 방향이 있는데, 현재 ci3버전 사용하실거 같은데 ci2버전의 encript를 분석해서 encript부분을 이전버전으로 오버라이드 하는 방향으로 수정하는 것도 한 방법일거 같습니다. 다만 보안을 위해선 Mcrypt의 설치를 하심이 좋을거 같습니다. 설치하는게 php가 서버에서 소스설치가 아니라면 구지 어려운것도 아니라 서버관리자분께 설치를 부탁하는게 좋아보입니다.

정수리 / 2016/07/08 16:15:49 / 추천 0

@닉 

답변 정말 감사합니다

사내에서 학습용으로 사용하고 있는 서버입니다.

제가 버전업을 하고 싶지만 결정권이 없어서 ...

다행히 git에서 적당한 파일을 찾아 해결하였습니다.^^ 언제나 도움주셔서 감사합니다.

kaido / 2016/07/08 16:54:18 / 추천 0

@닉

오토캐스팅은 php의 꽃 과 같은 존재 입죠.

의미 그대로입니다. 형 변환을 시켜준다는 이야기입니다.

$a = 0;
if($a == "0") echo "0 입니다.";

오류가 나오지 않고 0 임을  비교 합니다만,
이 조건문 php가 아닌 다른 언어 하는 사람이 보면 위화감을 느낌입니다.
네. $a는 숫자형 인데 왜 문자형으로 비교했는데 정상이죠?

오토캐스팅을 해서 그렇습니다.

php는 최적의 상태로 캐스팅 변환을 해버립니다.

문자 숫자 치환은 그렇다 칩니다만...

null 0 "" false
이 4종류 까지 형변환을 이룬다는 소리입니다.
boolean 형태의 연산이 필요하면 0이 false 가 되고 false 가 숫자 연산이 필요하면 0이 된다는 소리입니다.

이걸 java에서 해보시면 극명하게 이 차이를 느끼게 됩니다.
java는 절대적으로 데이터 형태에 매우 엄격하거든요.

말씀하신 것처럼 좀더 정확한 비교를 위해서 === 를 사용 합니다.

좀더 정확하게 비교를 위해서 php 에서는

isset() , empty(), is_null() 등을 제공 합니다.

[다만 저것도 연산문에 들어가서 비교 되면 도루묵이 된다는 개그 아닌 개그가...]

 

저것들의 요약 정리

Value of variable ($var) isset($var) empty($var) is_null($var)
“” (an empty string) bool(true) bool(true)  
” ” (space) bool(true)    
FALSE bool(true) bool(true)  
TRUE bool(true)    
array() (an empty array) bool(true) bool(true)  
NULL   bool(true) bool(true)
“0” (0 as a string) bool(true) bool(true)  
0 (0 as an integer) bool(true) bool(true)  
0.0 (0 as a float) bool(true) bool(true)  
var $var; (a variable declared, but without a value)   bool(true) bool(true)
NULL byte (“\ 0”) bool(true)  

 

/ 2016/07/08 17:27:06 / 추천 0

@kaido empty()같은 함수 말한거였군요 ?? ㅎ

kaido / 2016/07/08 17:28:54 / 추천 0

@닉

다 있는걸 뭐하러 개별로 만들어서 체크 합니까? ㅎㅎ

php는 당신이 아는 것 보다 더 많은 함수를 가지고 있습니다.

찾다보면 깜짝 놀랄 만큼요!

 

그리고 오토캐스팅은 딱잘라 말해서 숫자 0 만 조심 하면 됩니다.

이놈이 논리 오류의 최고 주범이거든요.