2013-08-26 2 views
-1

최근 프로젝트에서 데이터베이스의 암호를 일치시킬 때 문제가 있습니다. 다음과 같이일치하는 데이터가있는 행을 찾을 수없는 MySQL 문

쿼리는 다음과 같습니다

mysql_query("SELECT * FROM user_accounts WHERE username = '$username' AND password = '$encryptedPass'") 

SELECT * FROM user_accounts WHERE username = 'T-McFarlane' AND password = 'äê1\Y¸c' 

를 출력 그것은 단지 사용자와 나를 찾을 수 있지만 암호로는 할 수 없습니다. 나는 데이터베이스 암호와 암호화 된 암호가 제공하는 것을 모두 반향 시켰으며 정확히 동일합니다. 이것은 데이터베이스에 있지만 일치하는 행을 찾을 수 없습니다.

제 질문은이 암호에 특수 문자가 포함되어 있습니까? 아니면 실패하고있는 다른 이유가 있습니까?

데이터베이스에서 데이터 정렬 설정에 utf8_swedish_ci와 latin1_swedish_ci를 모두 시도했습니다.

+6

왜 작동하지 않는지 신경 쓰지 마세요. 이는 비밀번호 인증을 수행하는 매우 위험한 방법이며 즉시 중지하는 것이 좋습니다. (SQL injection 참조). 대신 준비된 문을 사용해보십시오. 해답이 바이너리 암호화에 있다고 생각합니다. 대신 해시 된 해시 알고리즘을 사용하면 문제가 해결됩니다. –

+0

나는 이미 복어와 소금에 절인 알고리즘을 사용하고 있습니다. 문제는 Bermer가 말한 바와 같았습니다. 저는 그 문자열을 벗어나는 것을 잊었습니다. – ThomasMcFarlane

+0

* Barmar - 죄송합니다. 멀티 태스킹. – ThomasMcFarlane

답변

0

당신은 문자열에 특수 문자를 이스케이프해야합니다

$username = mysql_real_escape_string($username); 
$encryptedPass = mysql_real_escape_string($encryptedPass); 
mysql_query("SELECT * FROM user_accounts WHERE username = '$username' AND password = '$encryptedPass'") 

그러나, PDO 또는 mysqli로 전환하고, 매개 변수화 쿼리를 사용하는 것이 더 나은 것입니다.

+0

감사합니다. 잠시 동안 프로젝트를 시작하지 않았습니다. 문자열을 이스케이프 처리하기 위해 무언가를 잊어 버렸지 만 함수가 무엇인지/프로세스라고 불리는 것은 마음에 들지 않았습니다. 그래도 일을 완벽하게 마쳤습니다. – ThomasMcFarlane

+0

downvote에 대해 유감 스럽지만 mysql_query는 더 이상 사용되지 않습니다. 해당 ** mysqli ** 함수로 대체해야합니다. 위의 Andy Lester의 주석 또는 [http://codular.com/php-mysqli](html/codular.com/php-mysqli) – David

+0

을 참조하십시오. 해당 주석은 OP에 전달되어야합니다. 다른 API를 사용하도록 애플리케이션을 다시 작성하는 것은 IMHO라는 질문에 대한 답변 범위를 벗어납니다. – Barmar

관련 문제