2

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上司の命令です。

4

2 に答える 2