Cookie とデータベースの両方に md5 ハッシュを保存しています。validate_cookie()
この Cookie を読み取り、データベースにクエリを実行して、このハッシュに関連付けられているユーザーを見つける関数があります。
validate_cookie()
別の関数を呼び出しget_user_data()
て、実際のクエリを実行します。get_user_data()
他のいくつかの関数やスクリプトから呼び出されるため、送信するクエリはかなり一般的です。関数は次のとおりです。
function get_user_data($info,$password=Null,$source=Null)
{
if(!$source)
{
$query = "SELECT * FROM `users` WHERE `id` = '".mysql_real_escape_string($info)."' OR `email` = '".mysql_real_escape_string($info)."' OR `cookie`='".mysql_real_escape_string($info)."'"; //Check to see if $info matches any column
}
else { $query = "SELECT * FROM `users` WHERE `".mysql_real_escape_string($source)."_token` ='".mysql_real_escape_string($info)."'";} //we got a social token
$result = mysql_query($query);
if($result)
{
$row = mysql_fetch_array($result);
if($password)
{
if(crypt($password, $row['password']) == $row['password']) //password matching
{
return $row;
} else {return "Password does not match!";}
}
else { return $row; }
}
else { return "Could not get result from database!";}
}
この場合の重要なクエリは、if(!source){}
ブロック内にあります。このクエリをvalidate_cookie()
呼び出す方法で(そして、私はそれがこれになることをテストしました):get_user_data()
SELECT * FROM `users` WHERE `id` = '8sd8sdvsasdliwerhnbzo823' OR `email`='8sd8sdvsasdliwerhnbzo823' OR `cookie`='8sd8sdvsasdliwerhnbzo823'
id
は int フィールドであり、すべてが検証されるためemail
、このクエリから選択する必要がある行は、一致するcookie
フィールドを持つ行のみです。
ただし、このクエリを PHP スクリプトから呼び出すか、PHPMyAdmin から手動で呼び出すかに関係なく、常にターゲット行ともう 1 つの行 (そのフィールドにのみ含まれるテスト ケース) の両方が選択NULL
されcookie
ます。ハッシュを少し変更しても (まったく一致しないように)、この同じテスト ケースが選択されます。
私のクエリは、理解できない方法で不正な形式になっていますか? フィールドを一致させることがOR
できる難解な使用法はありますか? NULL
どんな助けでも大歓迎です。
PS 本当に を使うべきだと言われる前にmysqli
、はい、それはわかっています。mysql
上司の命令です。