PHP这段代码安全吗?

时间:2011-03-08 18:18:42

标签: php

我找到了以下代码in a previous question on S O.在下面的代码中,如果用户提供的用户名和密码正确,则user_id和username存储在会话中以保持记录。我的问题是,为什么需要在会话中保留user_id?只有一件事(例如,用户名)足以存储在会话中? 如果启用了记住,则仅设置用户名的cookie。 现在我的问题是,仅用户名cookie是否足够?任何人都不能在浏览器中编辑或添加cookie并登录系统吗?

感谢您的回复。

<?
public function login($username, $pass, $remember) {
    // check username and password with db
        $result = $conn->query("select * from login where
                            username='".$username."' and
                           password=sha1('".$pass."')");
        if (!$result) {
            throw new depException('Incorrect username and password combination. Please try again.');
        } 

       if ($result->num_rows>0) {
            $row = $result->fetch_assoc();
            $_SESSION['user_id'] = $row[user_id];
            $_SESSION['username'] = $username;

           // start rememberMe
            $cookie_name = 'db_auth';
            $cookie_time = (3600 * 24 * 30);*/ // 30 days

            // check to see if user checked box
            if ($remember) {
            setcookie ($cookie_name, 'username='.$username, time()+$cookie_time);
            }

            // If all goes well redirect user to their homepage.
            header('Location: http://localhost/v6/home/index.php'); 
            } else {
           throw new depException('Could not log you in.');
            }
    }

?>

5 个答案:

答案 0 :(得分:5)

这个代码不安全!(对不起,但是重点是它)。 SQL语句易受SQL注入的影响。将用户名存储在cookie中也是一个坏主意,因为任何人都可以伪造cookie来获得身份验证。

答案 1 :(得分:1)

我对这个问题的答案是否安全:不。

您需要清理代码。如果有人输入'test OR 1 = 1'作为用户名,会发生什么?

答案 2 :(得分:0)

我真的不知道从哪里开始。这段代码真的不安全。

  • 你应该消毒 mysql_real_escape_string()(或mysqli函数,甚至更好:使用PDO进行任何数据库连接并使用预处理语句) 用户名和密码,确保 $remember是一个布尔值 或整数。
  • sha1就像破了, 所以我建议改用md5
  • Cookie可以由用户重写 可以添加username=admin cookie并以admin身份登录。

答案 3 :(得分:0)

您的代码不安全。

您的数据通过初始查询对SQL注入开放,根据数据库用户的访问级别,您可以让任何人登录。您需要清理输入。

其次,通过cookie访问网站,以及其中的用户名与访问级别和权限相关?如果是这样,那么会话很容易被劫持。

答案 4 :(得分:0)

这是我用来确保一切安全的代码..它可能不是最安全的,但我也使用其他措施来验证安全登录。但是这段代码可以保护你免受SQL注入。

function secure($data) {
    $data = trim(htmlentities(strip_tags($data)));

    if (get_magic_quotes_gpc())
        $data = stripslashes($data);

    $data = mysql_real_escape_string($data);

    return $data;
}

这是用法

 secure($username);

例如

foreach($_POST as $key => $value) {
    $get[$key] = secure($value); 
}

这告诉PHP每个POST值保护它。 您也可以使用$ _GET代替$ _POST将其用于发布,但让我们面对它...使用GET命令登录将是非常愚蠢的