2013-04-29 2 views
3

현재 로그인 시스템이 작동하는 데 문제가 있습니다. 이유에 대해 알았지 만 왜 그런 일이 일어나고 있는지, 구체적으로 무엇이 원인인지 알지 못합니다.PHP에서 데이터베이스 검색시 해시 된 암호가 잘림

데이터베이스에 해쉬 된 암호가 저장되어 있습니다. password 컬럼의 값은 다음과 같습니다

18e2acd33fd3ec752c344b463d00238e35b6b77ed65941f69b9eb96471834f1e507d846071768548f8cf125d6c74ce614d477a576657983bb8620bbc49eed7de 

지금은 단순히 선택과 같이 PHP에서 해당 필드를 인쇄 할 갈 때 :

$query = "SELECT password FROM webusers WHERE username = 'Roy'"; 
$update = odbc_exec($connect, $query); 
$row = odbc_fetch_array($update); 
print $row['PASSWORD']; 

그것은 출력 :

18e2acd33fd3ec752c344b463d00238e35b6b77ed65941f69b9eb96471834f1e507d846071768548f8cf125d6c74ce614d477a576657983bb8620bbc49eed7d 

스크롤에 두 해시의 끝 부분에서 두 번째 해시가 최종 'e'가 누락 된 것을 볼 수 있습니다. 그러면 내 전체 로그인 시스템이 중단됩니다. 왜 이런 일이 일어날까요? 나는 PHP 또는 SQL이 비난 할 것인지 확실하지 않다.

PHP 5.4.7을 사용하고 데이터베이스는 ODBC를 통해 연결된 4D SQL 서버입니다.

편집 :password의 데이터 유형은 열 크기가 문제되지 않도록 4D의 설명서에 따라, 2GB의 데이터까지 저장할 수있는 Text이다.

+1

데이터베이스에있는 'password' 필드의 데이터 유형은 무엇입니까? PHPMyAdmin 또는 다른 도구를 통해 데이터베이스에서 암호 필드를 직접 볼 때 마지막 전자 메일 주소가 보이십니까? – MatthewMcGovern

+0

db에서이 필드의 길이를 늘리십시오. –

+0

@MatthewMcGovern 예, 4D에서 데이터베이스 필드를 볼 때 마지막 e가 표시됩니다. 필드 유형은 '텍스트'입니다. – Roy

답변

0

문제가 MySQL 또는 PHP인지 확인하려면 직접 MySQL에 로그인하고 SQL 명령을 직접 실행하면서 전체 값을 검색 할 수 있는지 확인하십시오. PHP에서 사용하는 것과 동일한 SQL 쿼리를 사용하여 응용 프로그램에서 볼 수있는 것과 동일한 출력을 MySQL 시스템에서 볼 수 있습니다. MySQL (PHP가 더 이상 그림의 일부가 아님)에있는 동안 잘린 값을 보면, MySQL에서 정의한 필드의 글자 제한을 초과했다는 것을 확실히 알 수 있습니다. 마찬가지로 문자열이 완벽하게 표시되면 PHP는 값을 잘라야합니다.

PHP가 값을 잘라내는 경우 mysql_result 객체의 제한 사항이거나 PHP의 시스템 제한 일 가능성이 낮습니다. 문제의 위치를 ​​더 좁히면 답이 명확 해집니다.

PHP가 문자열을 자르지 않는 것을 본 적이 없습니다. 전자 메일에 첨부 파일 헤더를 만드는 동안 적어도 하나의 문자열 값에 적어도 1MB의 데이터를 저장했습니다. 귀하의 한계가 PHP 언어에 있다고 생각하지 않습니다.

+0

그것은, 내가 사용하고 MySQL은 아니지만 4D의 SQL 구현. 이 필드는 데이터베이스 자체 내에서 문제가 없습니다. 나는이 문제를 해결하기 위해 다른 방법을 사용 해왔다. 그러나 내가 사용하고있는 오래된 ODBC 드라이버에 결함이있는 것처럼 보였다. 차라리 사용하지는 않겠지 만 불행히도이 시점에서 약 15 세의 기존 시스템을 구축해야하며 많은 선택의 여지가 없습니다. 어쨌든 귀하의 회신에 감사드립니다! – Roy

관련 문제