如何使这个PHP / SQL代码更安全?

时间:2011-05-12 21:44:18

标签: php security authentication

我想知道如何让这段代码更安全,我将它用作login.php:

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

我想让它更安全地防止sql注入等。你有什么想法 ?我想了解更多有关制作更安全网站的信息。

谢谢老兄和老兄

编辑:

抱歉,我没有发布所需的所有代码,但这里是完整的代码:

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

?>

再次感谢你:)

4 个答案:

答案 0 :(得分: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)并使用盐 见:https://stackoverflow.com/search?q=hash+salt+mysql
有关这方面的更多信息。

答案 1 :(得分:1)

您应该使用mysqli_real_escape_string来转义特殊字符(假设您正在查询数据库)。例如。 $password = mysqli_real_escape_string($link, $_POST['password']);。否则,似乎很好。

答案 2 :(得分:1)

您的代码未显示您实际使用数据库的内容。

如果使用常规的mysql_query,则需要对不需要的字符,引号(“,”)进行编码。

您还需要记住,人们可能希望在密码中使用这些字符,因此您需要将它们存储在以某种方式编码的数据库中。

可能是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.

答案 3 :(得分: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需要被转义。   这可能是或多或少的字符   比什么addlashes更能照顾。