2011-05-12 35 views
0

我不知道我怎樣才能使這個代碼更安全,我用它的login.php:如何使這個PHP/SQL代碼更安全?

if(isset($_POST["username"]) and isset($_POST["password"])) { 
if($_POST["username"] == $adminusr && $_POST["password"] == $adminpass){ 

我想讓它多一點安全,防止SQL的注射劑等等。你有什麼想法 ?我想了解更多關於製作更安全的網站。

謝謝帥哥dudettes

編輯:

對不起,我沒有張貼所需的所有代碼,但這裏是完整的代碼:

<?php 
session_start(); 
include_once("../include/config.php"); 

if(isset($_POST["username"]) and isset($_POST["password"])) { 
if($_POST["username"] == $adminusr && $_POST["password"] == $adminpass){ 

    $_SESSION['admin_user'] = $adminusr; 
    $_SESSION['admin_password'] = $adminpass; 
} 
else { 
    echo "Wrong Username or Password"; 
} 

}else if(isset($_GET['act']) && $_GET['act']=='out') { 
unset($_SESSION['admin_user']); 
unset($_SESSION['admin_password']); 
session_destroy(); 

} 

if($_SESSION['admin_user'] == $adminusr && $_SESSION['admin_password'] == $adminpass){ 
$_SESSION['testdd'] = 'test'; 
header("location:index.php"); 
exit; 
} 

?> 

再一次謝謝:)

+3

我沒有看到任何與此代碼相關的SQL。 – 2011-05-12 22:03:46

+0

對不起,這裏是=) – MstrQKN 2011-05-12 22:08:45

+1

那裏還沒有什麼SQL相關的。 $ adminusr和$ adminpass從哪裏來? – 2011-05-12 22:14:17

回答

2

如果你在查詢中使用$_POST['username']下面的代碼將讓你從SQL注入保存。

$username = mysql_real_escape_string($_POST["username"]); 
$password = mysql_real_escape_string($_POST["password"]); 

$query = "SELECT * FROM users 
      WHERE users.username = '$username' 
      AND users.Passhash = SHA2(CONCAT(users.id,'$password'),512) "; 
$result = mysql_query($query); 
.... 

請注意,您需要使用mysql_real_escape_string()mysql_query
mysqli_real_escape_string()mysqli_query

更妙的是使用PDO與PHP5,請參閱:http://www.php.net/manual/en/book.pdo.php

處理在MySQL密碼是強烈建議不要存儲明文密碼在你的數據庫
注意。
始終在數據庫中存儲散列(最好使用SHA2)並使用salt。
參見:https://stackoverflow.com/search?q=hash+salt+mysql
欲瞭解更多信息。

1

您應該使用mysqli_real_escape_string來轉義特殊字符(假設您正在查詢數據庫)。例如。 $password = mysqli_real_escape_string($link, $_POST['password']);。否則,它似乎很好。

1

你的代碼並沒有顯示你實際上對數據庫做了什麼。

如果使用常規的mysql_query,你需要編碼不需要的字符,例如引號(」「)。

你還需要記住,人們可能希望在自己的密碼這些字符,所以你需要將它們存儲在以某種方式編碼的DB。

大概一個MD5哈希,或只是普通的實體編碼(見下文)。

htmlentities($pass,ENT_QUOTES,'UTF-8') 


(!get_magic_quotes_gpc()) ? mysql_real_escape_string($item):$item; 

您仍然應該使用變量綁定,有助於避免任何SQL注入。

Check out this introduction to PDO, its really useful.

+0

我很欣賞你正在嘗試幫助,但是這些都是你說的那種邊界不好的建議。例如,篩選出「and」並不是一個可接受的解決方案,但它肯定是逃避的,所以你有它的一部分是正確的 – 2011-05-12 22:04:41

+0

對不起,如果這是不可理解的,通過篩選出來,我的意思是不直接進入查詢... – Zsipgun 2011-05-13 10:05:01

+0

這看起來更好 – 2011-05-13 13:28:30

1

我想你的代碼應該是這樣的:

if(isset($_POST["username"]) and isset($_POST["password"])) { 
$handle = mysql_connect($host, $user, $pass); 
mtsql_select_db($db, $handle); 
$query = "SELECT user FROM table_users WHERE user='{$_POST["username"]}' AND password=MD5('{$_POST["password"]}')"; 
$result = mysql_query($query, $handle); 
if(mysql_num_rows($result) == 1) 
{ 

你所需要的就是用mysql_real_escape_string()PDO prepared statement轉義特殊charcarter,所以我們改變這一點:

$input["user"] = mysql_real_escape_string($_POST["username"]); 
$input["password"] = mysql_real_escape_string($_POST["password"]); 
$query = "SELECT user FROM table_users WHERE user='{$input["user"]}' AND password=MD5('{$input["password"]}')"; 
. 
. 
. 

您也可以使用addslashes()函數,但它可能是sufficient enough,我從this引用:

addslashes向通常令人不安的字符 添加斜槓。 mysql_real_escape_string轉義 任何MySQL需要轉義。 這可能是或多或少的字符 比addslashes照顧。