0

正しいユーザー名とパスワードでログインすると、「間違ったユーザー名またはパスワード」というエラーが表示され、データベース接続が機能し、パスワードとユーザー名のチェックに問題があると思います。

    <?php
    $host="mysql12-int.cp.hostnet.nl"; // Host name
    $username="u33936_mick"; // username
    $password="//password was correct"; // password
    $db_name="db33936_axe"; // Database name
    $tbl_name="users"; // Table name


    mysql_connect("$host", "$username", "$password");
    mysql_select_db("$db_name");



    $myusername = stripslashes($myusername);
    $mypassword = stripslashes($mypassword);
    $myusername = mysql_real_escape_string($myusername);
    $mypassword = mysql_real_escape_string($mypassword);
    $sql = 'SELECT * FROM `users` LIMIT 0, 30 WHERE username="$myusername" and        
    password="$mypassword"';
    $result=mysql_query($sql);


    $count=mysql_num_rows($result);



    if($count==1){
      session_register("username");
      session_register("password");
      header("location:index.php");
    } else {
      echo "Wrong Username or Password";
    }
    ?> 

これが私のフォームです

     <form name="login" method="post" action="login.php">
                <fieldset id="inputs">
                    <input id="myusername" type="text" name="myusername"    
    placeholder="Username" required="">  
                    <input id="mypassword" type="password" name="mypassword"      
    placeholder="Password" required="">
                </fieldset>
                <fieldset id="login.php">
                    <input type="submit" id="submit" value="Login">
    </style>
                </fieldset>
            </form>
4

2 に答える 2

7

何よりもまず、 ( docs ) または PDO ( docsmysql_* )を支持して、非推奨の関数ファミリーから移行することを検討することをお勧めします。どちらも、コードに関する限り、あなたの側で大きな変更を必要としません。mysqli

特定のバグに関しては、値をクエリに誤って連結しているようです。また、ごWHERE注文LIMITは正しくなく、無効な SQL です。正しい形式は次のとおりです。

$sql = '
    SELECT 
        * 
    FROM 
        `users` 
    WHERE 
        username="'.$myusername.'" AND 
        password="'.$mypassword.'"
    LIMIT 0, 30 
';

LIMITこのステートメントを使用することでどのような利点が得られるかは明確ではありません。一致する行が 1 つあるか、まったくないかのいずれかです。どちらかといえば、私は使用しますLIMIT 1。30行戻ってきたらどうする!?

PDO への変換は簡単です。PDO での同じクエリは次のようになります。

$host="mysql12-int.cp.hostnet.nl"; // Host name
$username="u33936_mick"; // username
$password="//password was correct"; // password
$db_name="db33936_axe"; // Database name

$pdo = new PDO('mysql:host='.$host.';dbname='.$db_name, $username, $password);
$sth = $pdo->prepare('
        SELECT 
            * 
        FROM 
            `users` 
        WHERE 
            username=:username AND 
            password=:password
        LIMIT 0, 30 
');
$sth->execute(array('username'=>$myusername, 'password'=>$mypassword));
$user = $sth->fetch();

バインドされたパラメーター (ここに示されている) で PDO を使用する場合、コードで行ったようにサニタイズする必要はmysql_real_escape_stringないことに注意してください。addSlashes

$mypasswordと を定義している場所は明確ではありませんが$myusername、登録済みグローバルを使用している場合は、コードを変更する必要があります。から値を直接取得します$_POSTaddSlashes安全ではなく、登録されたグローバルでもありません。

ドキュメンテーション

于 2013-06-27T20:48:48.963 に答える
2

いくつかの問題:

  • $_POST['myusername']投稿された変数を取得するには、etc. を使用する必要があります。に依存しているregister_globals場合は、非推奨であり、セキュリティ上のリスクがあるため、オフにする必要があります。
  • このLIMIT節は mysql の最後にあります。
  • 関数やエスケープ関数などの関数を使用して送信された情報を変更しないでくださいstripslashes。代わりに、PDO / mysqli でバインドされた変数を含む準備済みステートメントを使用する必要がmysql_*あります。関数は非推奨であり、パスワードにはスラッシュなどを含めることができるからです。

補足として、パスワードをソルトしてハッシュする必要があります。プレーンテキストのパスワードをデータベースに保存しないでください。

于 2013-06-27T20:50:20.433 に答える