2013-10-31 149 views
2

好吧,我知道這是錯誤的方式,我沒有實施鹽和其他小安全提示 但現在我需要了解這裏有什麼問題,然後我可以實現其他安全功能到腳本,感謝您的幫助:) 當運行這個,腳本返回登錄錯誤,我可以理解爲什麼,我打印密碼$ _POST ['密碼'],它是相同的數據庫,但當試圖打印$ col2(密碼從數據庫中獲得)不返回任何內容。 下面是代碼:在PHP和Mysqli登錄錯誤腳本

<?php 

$mysqli = new mysqli("localhost", "root", "*******", "test"); 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 
/* prepare statement */ 
if ($stmt = $mysqli->prepare("SELECT username, password FROM users WHERE username=? AND password=?")) { 
    $stmt->bind_param("ss" , $username, $password); 
    $stmt->execute(); 
    /* bind variables to prepared statement */ 
    $stmt->bind_result($col1, $col2); 
    $stmt->store_result(); 
    /* fetch values */ 
    while ($stmt->fetch()) { 
     printf("%s %s\n", $col1, $col2); 
    } 

    if($col1 && $col2 == $username && $password){ 
    $_SESSION['Admin']; //test - not to be implemented 
    session_start(); //Test - not to be implemented 
    header("location index2.php"); 
    }else{echo "Login Error";} 
    /* close statement */ 
    $stmt->close(); 
} 
/* close connection */ 
$mysqli->close(); 
?> 
+2

'$ col1 && $ col2 == $ username && $ password'你在哪裏看到這種語法?事實上,您並未向我們提供有關$用戶名和$密碼的信息。你從哪裏得到它們? $ username nad $密碼發佈的值?你綁定了它們,所以它來自用戶?你如何申報? –

+0

談到登錄腳本時,你不應該試圖從頭開始創建所有的東西。有太多可能會出錯的地方。 – Sliq

回答

2
if($col1 && $col2 == $username && $password){ 

此語句檢查$col1TRUE$col2 == $username$passwordTRUE

這種情況永遠不會發生,您的腳本將始終顯示該錯誤消息。

請看下面的例子:

$username = $col1 = 'user'; 
$password = $col2 = 'pass'; 
var_dump($col1 && $col2 == $username && $password); 

這將返回bool(false)

if($col1 == $username && $col2 == $password) { 
0

if($col1 && $col2 == $username && $password)是什麼呢? :)

在PHP這意味着如果$col1$col2比零和$username$password有其他的任何值也值不爲0的,然後它是確定

你需要像創造的東西

if($col1 == $username && $col2 == $password)

如果你保持MD5哈希以dB爲單位使用

if($col1 == $username && $col2 == md5($password))

或者在具有md5功能的mysql中進行。

我注意到你在printf("%s %s\n", $col1, $col2);之後開始會話,這將導致headers already sent

$_SESSION['Admin'];這也將導致注意到怎麼一回事,因爲定義此變量

,另一個問題是與header()函數。在這個函數之前你不能打印任何東西,因爲它也會導致'headers already sent'。

0

一些明顯的問題:

因此,要解決這個問題,你可以按照以下步驟改變你的代碼

在session_start();必須先於任何$ _SESSION變量使用

header(「location index2.php」);標題必須先於任何其他東西發送

header(「location index2。PHP的「);位置

0

除了其他人在他們的答案已經注意到這些問題後沒有冒號,你也混程序 mysqli的陳述和面向對象 mysqli的語句。

既然你通過初始化一個new mysqli()啓動,則必須按照面向對象的語法。

變化mysqli_connect_errno()$mysqli->connect_errno