2013-08-15 4 views
0

PHP에서 웹 서비스에 대한 인증 채널을 만들고 있습니다. 처음 두 줄에서는 나는 데이터베이스에서 사용자에 대해 설정 한 무작위 18 바이트 16 진수를 만들고 다른 쪽 끝의 사용자에게도 동일한 auth_token을 보냅니다. 그러나 사용자가 동일한 auth_token을 보내 일부 데이터를 가져 오면 스크립트에서 데이터베이스를 검색 할 수 없습니다. 데이터베이스에서 쿼리 된 16 진수 코드에는 몇 가지 문제가 있습니다. 도와주세요.PHP bin2hex with mysql

$hex = bin2hex(openssl_random_pseudo_bytes('18')); 
$database->executeObject('UPDATE tbluser SET user_auth_token="'.$hex.'" WHERE user_name="'.$_POST['uid'].'"'); 
... 
... 
... 
}elseif ($_POST['query'] = "fetch" && !empty($_POST['auth_token'])){ 
$token = $_POST['auth_token']; 
$uid = $database->executeObject('SELECT user_id AS id FROM tbluser WHERE user_auth_token="'.$token.'"'); 
if (!empty($uid)){ 
    $fname = $database->executeObject('SELECT writer_first_name as fname FROM tblwriter WHERE user_id="'.$uid.'"')->fname; 
    echo $fname; 
    exit; 
}else{ echo "Not Authorized"; exit; } 
+3

항상 SQL 쿼리로 들어가는 모든 것을 이스케이프 처리합니다! SQL 주입 공격에 취약합니다. – Sven

+0

내 데이터베이스 클래스에서 처리하고 있습니다. –

+0

여기에 SQL 주입 보호에 대한 설명이 있습니다. http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php –

답변

0

여러분의 executeObject() 함수에서 추측하고 있지만 불일치하게 사용하는 것처럼 보입니다.

처음으로 호출하면 스칼라 user_id가 반환 될 것으로 예상됩니다.

$uid = $database->executeObject('SELECT user_id AS id FROM tbluser 
    WHERE user_auth_token="'.$token.'"'); 

이제 $ uid에 결과 집합 개체 또는 사용자 ID에 대한 개별 값이 한 행에 있습니까? 나는 $ uid가 결과 집합을 포함 할 것을 제안한다.

두 번째로 executeObject()를 호출하면 객체가 반환 될 것으로 예상되므로 해당 열의 값을 얻으려면 특정 필드 fname을 참조해야합니다. 그것은 나타납니다

if (!empty($uid)){ 
    $fname = $database->executeObject('SELECT writer_first_name as fname 
     FROM tblwriter WHERE user_id="'.$uid.'"')->fname; 
    echo $fname; 
    exit; 

는 개별 열의 값을 얻을 수 ->fname를 사용해야합니다. 그렇다면 왜 첫 번째 쿼리에서 ->user_id을 사용 했습니까?

나는 당신의 인증 토큰에 대한 검색이 실제로을 성공 것을 제안하고있어,하지만 당신은 전체 결과는 첫 번째 쿼리가 아닌 개별 열의 값에서 객체을 설정 보간하여 FNAME를 검색합니다. 따라서 두 번째 쿼리가 올바르게 검색되지 않습니다.

쿼리 결과 개체에 매우 지능적인 __toString() 메서드가 내장되어 있지 않으면.

+0

귀하의 노력과 시간에 많은 감사를드립니다. auth_token을 검색하지 못했습니다. fname에 대한 검색이 정상적으로 작동합니다.나는 아래로 스크립트를 깨고 확인했다. auth_token이 성공하지 못하는 이유는 여하튼 탈출 사물입니다. 그러나 내 데이터베이스 클래스를 사용하는 동안, 어떻게 든 그것을 쿼리에서 보내기 전에 그것을 탈출하는 방법을 이해할 수 없습니다. –

+0

어떤 데이터베이스 클래스를 사용하고 있는지 알 수 없으므로 더 이상 지원할 수 없습니다. –

0

많은 분들께 감사드립니다. 스크립트가 완벽하게 작동합니다. 실수로 데이터베이스에서 37 대신 user_auth_token 18의 길이를 설정했습니다. 다시 한번 감사합니다.