繁体   English   中英

Php登录系统,如何保护它

[英]Php login system, how to secure it

这是一个php新手。 下面是我用来构建登录系统以输入mypage.php的代码

它工作得很好但很天真,任何人都可以在网址中键入mypage.php并避开登录页面。 我怎样才能使它更安全?

非常感谢!

    if(isset($_POST['submit'])) {
        $user = $_REQUEST['user'];  
        $pass = $_REQUEST['pass'];
        $sql = "SELECT * FROM login WHERE user='".$user."'";
        $res = $this->new_db->select($sql); 
        $row = $this->new_db->get_row($res);
        if (isset($row)) {  //user exists?
            if($row["pass"] == $pass){
$_SESSION['userId'] = $row['user'];// TRYING WITH SESSIONS
                header("Location: mypage.php");
            } else {
                echo "wrong pass";
            } 
        } else {
            echo "user does not exist";    
        }
    }

然后在mypage.php中

if(isset($_SESSION['userId'])) {

//contents

} else {
echo "there's an error";

}

它打印“有一个错误”为什么? 非常感谢

三件事:

  1. 不要以纯文本格式存储密码。 鉴于此代码,我只能假设您正在做的事情。 您应该存储密码哈希值,哈希用户输入的密码,然后比较这些密码。
  2. 您有SQL注入漏洞。 每当您收到来自用户的输入数据库查询时,至少应将其包装在mysql_real_escape_string()
  3. 在登录页面(在任何登录页面上),您将要跟踪用户是否已登录。一种简单的方法是使登录表单设置$_SESSION值,指示用户当前登录状态。 然后在需要用户登录的任何页面上,检查该值。 如果它存在,他们以前登录过。如果没有,他们没有。 它很简单,但足以满足您的需求。

是的,你的代码中可能有sql-injection,以防止你使用mysql_real_escape_string函数

检查我的答案,我在一段时间之前发布,这解释了你应该如何使用登录系统。

开源丰富的HTML编辑器

您需要在mypage.php中放置一些东西来检查用户是否“登录”。 我在过去使用Zend Framework的Zend Auth模块完成了这项工作。 关于它的很酷的事情是它可以单独使用,(你不必使整个Zend Framework站点使用Auth模块)。 我使用Zend Auth Page来弄清楚如何使用它。

然后,一旦我使用Zend会话设置auth会话,我只是检查了任何其他页面,看看用户是否“登录”了这样的事情:

private function _loggedIn()
{
    $loggedIn = false;
    $Namespace = new Zend_Session_Namespace('Zend_Auth');
    foreach ($Namespace as $index => $value) {
        $loggedIn = ($value->user_id);
    }
    return $loggedIn;
}

首先,您必须保护您的mysql查询免受sql注入。 这可以通过添加mysql_real_escape_string来实现:

$user = mysql_real_escape_string($_REQUEST['user']);  

然后,如果您不希望用户在mypage.php情况下访问mypage.php ,则应在登录脚本中设置一些cookie(如果登录成功),然后在mypage.php检查该cookie以查看如果它在您的数据库中匹配。 像这样的东西:

login.php中:

if($row["pass"] == $pass){
   setcookie("userid",$user);
   setcookie("passhash",sha1($pass));
...

mypage.php

$res = mysql_query("select * from login where user='".mysql_real_escape_string($_COOKIE['userid'])."' limit 1");
$row = mysql_fetch_assoc($res);

if($_COOKIE['passhash'] == sha1($row['pass']))
{
    die("logged in OK");
}
else
{
    die("please log in");
}
if (isset($_POST['submit'])) {
  $user = $_REQUEST['user'];  
  $pass = $_REQUEST['pass'];

  $sql = "SELECT user FROM login WHERE user='".mysql_real_escape_string($user)."' AND pass=SHA1('".mysql_real_escape_string($pass)."')";
  $res = $this->new_db->select($sql);
  $row = $this->new_db->get_row($res);  

  if ($row['user'] != "") {  //user exists?
    header("Location: mypage.php");
  }else{
    echo "username and password combination is wrong";
  }
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM