2013-03-01 104 views
0

嗨創建一個簡單的登錄系統。我知道我做的方式完全不安全,但它只是爲了學習的目的,因爲即時通訊新的PHP。我在驗證時遇到了問題,如果用戶名或密碼存在於txt文件中,它現在不會報告。我還將使用會話(未完全實現)來跟蹤用戶是否登錄。php檢查txt文件中的匹配

  <?php 
     session_start(); // session 


     if(isset($_POST['register'])) // Register USER 
    { 
     $user = $_POST['username']; 
     $password=$_POST['password'].PHP_EOL; 
     $fh = fopen("file.txt","a+"); 
     fwrite($fh,$user." ".$password); //write to txtfile 
     fclose($fh); 
    } 

在TXT文件中的輸出是這樣的:

 user1 password1 
     user2 password2 

這就是我需要幫助

 if(isset($_POST['Login'])) 
     { 
     $_SESSION['username']=$user; 
    $_SESSION['password']=$password; 

    $file = file_get_contents("file.txt"); 



if (strpos($file, "$user $password".PHP_EOL) !== false) 
    { 
    // go to login page 
    } 
    else 
{ 
    //ERROR 
} 

    ?> 
+1

永遠不要將密碼以純文本形式存儲在可通過文檔根訪問的文本文件中! – simplyray 2013-03-01 09:06:22

回答

2

file_get_contents()一個文件名,而不是一個文件指針,所以你應該使用file_get_contents('file.txt')並擺脫fopen呼叫。

http://php.net/manual/en/function.file-get-contents.php

然後,$file的值是包含在文件中的所有內容作爲單個字符串的字符串。所以你可以使用普通的字符串操作,不需要任何feof的東西。

然而,你可能想看看file(),它可能對你有用:

http://php.net/manual/en/function.file.php

編輯:

你也有你的邏輯存在問題。

您正在檢查用戶名,然後是密碼作爲單獨的操作。這將匹配任何用戶與任何用戶的密碼。比方說,我們有用戶密碼爲「foo」的愛麗絲,以及密碼爲「bar」的bob,以及目前的邏輯,愛麗絲可以用「foo」或「bar」作爲密碼登錄。

那麼你實際上是尋找的是一個單一字符串,這是用戶名和密碼的級聯,因爲它是在文件中找到(如"alice foo".PHP_EOL):

if (strpos($file, "$user $password".PHP_EOL) !== false) { 
    // go to login page 
} else { 
    // error 
} 

您需要的原因這就是你用來標記記錄結尾的內容。如果你不把它放在搜索字符串中,那麼你將匹配真正密碼的任何子字符串,包括一個空的密碼。 (該文件包含文本"alice foo".PHP_EOL,它包含文本"alice ",但不包含文本"alice ".PHP_EOL)。

+0

我已根據您的建議更新了代碼。驗證仍不起作用 – Dynamiite 2013-03-01 09:15:58

+0

確定已更新的答案。 – leftclickben 2013-03-01 09:35:24

+0

感謝您的幫助真的很感謝 – Dynamiite 2013-03-01 09:41:38

1

的問題是在這裏:

$fp = fopen ("file.txt", "r"); // read from file 
$file = file_get_contents($fp); 

使用fopen可以逐行讀取文件中的行,並使用file_get_contents您指定的文件名作爲參數不是一個文件句柄得到整個文件的內容作爲一個字符串。

你混淆了兩者。

+0

感謝您解決這個問題。這個問題仍然存在。 – Dynamiite 2013-03-01 09:20:32

0

因爲你正在學習,我不會給你的代碼,但可以給你邏輯 爆炸通過「\ n」個 然後通過空間爆炸結果數組值

檢查,如果該數組值0和1等於用戶名和密碼,如果相同則成功

還有任何疑問,隨時問引號內

+0

如果我卡住了,我會試一試並報告給你) – Dynamiite 2013-03-01 09:29:34

+0

這看起來是否正確$ result = explode(「\ n」,$ file); foreach($ result爲$ 1) { $ results = explode(「」,$ one); //通過空間爆炸 print_r($ results); } – Dynamiite 2013-03-04 11:49:29

1

PHP變量會像只串 $ _SESSION [「用戶名」] =「$用戶」; 像這樣使用它$ _SESSION ['username'] = $ user;