簡體   English   中英

登錄腳本所需的PHP幫助

[英]PHP help needed for Login script

使用正確的用戶名和密碼登錄時,出現錯誤“用戶名或密碼錯誤”,數據庫連接正常,我認為密碼+用戶名檢查有問題。

    <?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>

最重要的是,我建議您着眼於從不推薦使用的mysql_*函數系列過渡到mysqlidocs )或PDO( docs ),這兩者都不需要對代碼進行任何重大更改。

至於您的特定錯誤,看來您是在錯誤地將值連接到查詢中。 另外,您的WHERELIMIT順序不正確且無效的SQL。 這是正確的形式:

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

尚不清楚使用LIMIT語句會帶來什么好處。 您應該有一個匹配的行,或者沒有。 如果有的話,我將使用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(如此處所示)時, addSlashes像在代碼中那樣對mysql_real_escape_stringaddSlashes進行清理。

目前尚不清楚您在哪里定義$mypassword$myusername ,但是如果您使用注冊的全局變量,則應該更改代碼。 直接從$_POST獲取值。 addSlashes是不安全的,也不是已注冊的全局變量。

文獻資料

一些問題:

  • 您應該使用$_POST['myusername']等獲取發布的變量。 如果您依賴register_globals ,則應將其關閉,因為它已過時且存在安全風險;
  • LIMIT子句位於mysql的末尾;
  • 您不應該使用諸如stripslashes和轉義函數之類的stripslashes來修改發送的信息,而應該在PDO / mysqli中使用帶有綁定變量的准備好的語句,因為不建議使用mysql_*函數,並且密碼可以包含例如斜杠。

附帶說明一下,您應該對密碼進行加密和哈希處理,不要在數據庫中存儲純文本密碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM