1

サイトにパスワードで保護されたエリアを構築しようとしています。ただし、私のifステートメントでは、配列が空かどうかを判断するのに苦労しています。コードが実行されると、ユーザー/パス フィールドに何が入力されても、常に true としてテストされます。参考までに、アクセスされているデータベースには、1 つのユーザー/パス コンボを含む 1 つの行しかありません。

function verify(){

  $dbhost = "host";
  $dbname = "db";
  $dbuser = "user";
  $dbpass = "password";


  if (isset($_SESSION['valid_user']))return true;

  $user_name = $_POST["user_name"]; 
  $password = $_POST["password"];

  if ($user_name && $password){ 

    try{ 
      $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
    }
    catch(PDOException $pe){
      die('Connection error, because: ' .$pe->getMessage());
    }

    $sql = "SELECT user_name FROM users WHERE user_name = ':user_name' AND password = ':password'";     

    $q = $conn->prepare($sql);

    if(!$q){
      die("Execute query error, because: ". $conn->errorInfo());
    }; 

    $q->execute(array(':user_name'=>$user_name, ':password'=>$password));  

    $result = $q->fetchALL();

    if ($result['user_name']=$user_name){ 
      $valid_user = $user_name;
      $_SESSION['valid_user'] = $valid_user;
      return true;
    }
    else{  
      $text = "User Name and Password did not match";
      write_log_in($text);
    }
  }
  else {  
    $text = "This is a secure server. Please log in.";
    write_log_in($text);
  }
}

補足として、パスワードは少なくとも MD5 ハッシュ形式または同様のもので保存する必要があることを認識しています。さらに何かを追加する前に、それをまったく機能させたかっただけです。

4

4 に答える 4

2

これはあなたの問題です

if ($result['user_name']=$user_name){ 

そのはず

if ($result['user_name']==$user_name){ 

しかし、ユーザーが正しいかどうかを判断する結果があるかどうかを確認しないのはなぜですか。SQLクエリでユーザーを渡すためです。

于 2013-04-18T17:35:32.130 に答える
1

$result['user_name']=$user_nameする必要があります$result['user_name'] === $user_name

また、MD5 は使用しないでください。のような遅いハッシュ関数を使用してパスワードをハッシュしますがhash_pbkdf2、これは攻撃に費用がかかります。

于 2013-04-18T17:35:51.420 に答える
1

等号がありません:

if ($result['user_name'] == $user_name){ 
// ----------------------^
于 2013-04-18T17:35:06.083 に答える
-1

if (mysql_num_rows($result)==0) を使用できます。結果がない場合、入力されたパスワードを持つユーザーが正しくないためです

于 2013-04-18T17:43:54.493 に答える