2011-08-13 30 views
1

好吧,正如我所說的,我在這類代碼中沒有任何經驗。我只知道PHP的非常非常基礎知識,並且對MySQL的工作原理略有印象。PHP/MySQL註冊 - 我是一個新手

所以這是我使用的代碼(密碼星星阻擋在外)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<title>P.S.</title> 
<link type="text/css" rel="stylesheet" href="http://www.ps.niu-niu.org/ps.css" /> 
</head> 
<body> 
<div id="main"> 
HERE'S THE MAIN PART! 
<?php 

mysql_connect("localhost, "niuniu_ps", "**********") or die(mysql_error()); 

mysql_select_db("niuniu_ps") or die(mysql_error()); 


if (isset($_POST['submit'])) { 



if (!$_POST['username'] | !$_POST['pass'] | !$_POST['pass2']) { 

     die('You did not complete all of the required fields'); 

    } 





    if (!get_magic_quotes_gpc()) { 

     $_POST['username'] = addslashes($_POST['username']); 

    } 

$usercheck = $_POST['username']; 

$check = mysql_query("SELECT username FROM users WHERE username = '$usercheck'") 

or die(mysql_error()); 

$check2 = mysql_num_rows($check); 





if ($check2 != 0) { 

     die('Sorry, the username '.$_POST['username'].' is already in use.'); 

       } 




    if ($_POST['pass'] != $_POST['pass2']) { 

     die('Your passwords did not match. '); 

    } 





    $_POST['pass'] = md5($_POST['pass']); 

    if (!get_magic_quotes_gpc()) { 

     $_POST['pass'] = addslashes($_POST['pass']); 

     $_POST['username'] = addslashes($_POST['username']); 

      } 





    $insert = "INSERT INTO users (username, password) 

      VALUES ('".$_POST['username']."', '".$_POST['pass']."')"; 

    $add_member = mysql_query($insert); 

    ?> 




<h1>Registered</h1> 

<p>Thank you, you have registered - you may now login</a>.</p> 

<?php 
} 

else 
{ 
?> 



<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 

<table border="0"> 

<tr><td>Username:</td><td> 

<input type="text" name="username" maxlength="60"> 

</td></tr> 

<tr><td>Password:</td><td> 

<input type="password" name="pass" maxlength="10"> 

</td></tr> 

<tr><td>Confirm Password:</td><td> 

<input type="password" name="pass2" maxlength="10"> 

</td></tr> 

<tr><th colspan=2><input type="submit" name="submit" 
value="Register"></th></tr> </table> 

</form> 


<?php 

} 
?> 

</div> 
<div id="reflection"></div> </body> 

當我去ps.niu-niu.org/,它顯示爲:解析錯誤:語法錯誤在/home/niuniu/public_html/ps/index.php意外T_STRING第27行

+0

27號線在哪裏? – deceze

+0

我在閱讀問題之前編輯了您的代碼,我想我只是編輯了錯誤。你在mysql_connect函數中忘了localhost後面的雙引號(「),但它不是第27行,但是如果我是正確的,第27行會在你的代碼中產生一個空行 –

+0

另外''是位或運算符,你可能正在尋找'||'這是or運算符 –

回答

1

這並沒有具體回答你的「爲什麼不這項工作」,但它解決了一個更嚴重的問題的問題:你的整個系統是一個巨大的安全孔。我很抱歉,但這是真的。

$insert = "INSERT INTO users (username, password) 

      VALUES ('".$_POST['username']."', '".$_POST['pass']."')"; 

    $add_member = mysql_query($insert); 

它看起來是你的密碼插入到數據庫中作爲明文,未加密的文本。這是一個非常糟糕的主意。如果您的數據庫受到某種程度的破壞,那麼您的所有用戶的密碼就在那裏,並且很容易被盜取。大多數用戶在許多網站上使用相同的密碼,因此,不僅您的網站受到損害,而且您的用戶對其他網站的憑據也可能會如此。

此外,您的代碼是開放的SQL injection。在檢查用戶名時,你沒有做任何事情來清理輸入。攻擊者將一些代碼插入到用戶名框中而不是用戶名並獲取所有數據庫記錄是微不足道的。如果我們設置的用戶名作爲' or '1'='1,然後將查詢變爲:

SELECT username FROM users WHERE username = '' or '1'='1' 

這將返回所有的用戶名,並且該漏洞可能被進一步濫用,以顯示所有未加密的密碼!不是一種非常安全的方式來處理您的客戶的數據,並且危險,因爲您的數據可能全部被盜取,然後被刪除,全部都不需要登錄。

事實是,很多開發者—,聲稱的經驗,更不用說在— store passwords incorrectly之前幾乎沒有使用PHP的人。對於您的應用程序和用戶的安全性,您可以從頭開始編寫自定義身份驗證系統,並使用已經很好建立並且可行的方法,這會更安全。在PHP libraries for user authentication有一個堆棧溢出帖子(不要聽那個說你自己推出的人 - 他自己的例子充滿了漏洞,證明了我的觀點)。

+0

這都是真的,但與原始問題沒有任何關係,所以如何才能接受問題的答案是以「這不是專門回答你的問題」開頭的? –

+0

@NightOwl提問者選擇接受的答案。你的回答確實爲「爲什麼我會得到這個錯誤」這個暗含的問題提供瞭解決方案,但是原來的問題甚至不會提出一個問題 - 它只是拋棄了一些代碼和錯誤,而這個問題就是隱含的。我的答案指出了一個更重要的問題,即整個代碼塊是有風險的。提問者可能認爲這是更重要的反饋。這是一個看大局的問題。 – nhinkle

3

它看起來像你缺少周圍本地主機報價在連接字符串中...

mysql_connect("localhost, "niuniu_ps", "**********") or die(mysql_error()); 

應該的。 ..

mysql_connect("localhost", "niuniu_ps", "**********") or die(mysql_error()); 

而且這條線......

if (!$_POST['username'] | !$_POST['pass'] | !$_POST['pass2']) { 

應該是...

if (!$_POST['username'] || !$_POST['pass'] || !$_POST['pass2']) { 

單管是位運算符,並不會產生預期的結果。雖然可能與你的錯誤沒有關係。