Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php登录系统,如何保护它_Php_Security_Session_Login - Fatal编程技术网

Php登录系统,如何保护它

Php登录系统,如何保护它,php,security,session,login,Php,Security,Session,Login,这里有个php新手。 下面是我用来构建登录系统以进入mypage.php的代码 if(isset($_SESSION['userId'])) { //contents } else { echo "there's an error"; } $res = mysql_query("select * from login where user='".mysql_real_escape_string($_COOKIE['userid'])."' limit 1"); $row = mysql_

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

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

//contents

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

}
$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");
}
它工作得很好,但很幼稚,任何人都可以在url中键入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";

}
$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");
}
它正在打印“有一个错误” 为什么?
非常感谢

是的,您的代码中可能有sql注入
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";
  }
} 

为了防止您可能使用函数

首先,您必须保护您的mysql查询不受sql注入的影响。这可以通过如下方式添加
mysql\u real\u escape\u字符串来实现:

$user = mysql_real_escape_string($_REQUEST['user']);  
然后,如果您不希望用户能够在未登录的情况下访问
mypage.php
,那么如果登录成功,您应该在登录脚本中设置一些cookie,然后在
mypage.php
上检查cookie,以查看它是否与数据库中的cookie匹配。诸如此类:

$user = mysql_real_escape_string($_REQUEST['user']);  
login.php:

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

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

//contents

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

}
$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");
}

在这里检查我的答案,我之前发布过,这解释了如何使用登录系统

三件事:

  • 不要以纯文本形式存储密码。考虑到这段代码,我只能假设这就是你正在做的。您应该存储散列的密码,散列用户输入的密码,然后比较这些密码
  • 您有一个SQL注入漏洞。任何时候,当您接收到来自用户的输入,而该输入是用于数据库查询时,至少应该将其包装在
    mysql\u real\u escape\u string()
  • 在登录页面(在任何登录页面)上,您将要跟踪用户是否登录。一种简单的方法是让登录表单设置一个
    $\u SESSION
    值,指示用户当前的登录状态。然后在任何需要用户登录的页面上,检查该值。如果存在,则表示他们以前已登录。如果没有,他们也没有。这很简单,但足以让你满足你的需要

  • 您需要在mypage.php中放入一些内容来检查用户是否“登录”。我在过去使用Zend框架中的Zend Auth模块完成了这项工作。它的酷之处在于它可以单独使用(使用Auth模块不必创建整个Zend Framework站点)。我用电脑来弄清楚如何使用它

    然后,一旦我使用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;
    }
    

    你应该使用会话来检查登录凭据,这一点都不安全,也没有任何意义。我同意他应该使用会话…我正在使用他的代码,使其比以前更安全。不过,您使用md5的答案也不正确。MD5已被证明是不安全的。您应该始终使用SHA1或更安全的东西,即使
    SHA1()
    不安全,如果您知道,md5()或SHA1()可能会被破坏,因为我已经要求他使用任何他选择的东西。您的代码使用了不正确的逻辑来处理OP的问题。MD5和SHA1是不安全的。但它们仍然被使用。让他们更安全的是使用salts(给“md5 salts php”一个谷歌),或者使用bcrypt。使用COOKIES检查用户凭据??这是完全错误的,饼干不是为了这个。您应该改为使用会话。@Ibrahim Azhar Armar会话使用cookie存储会话ID,因此使用会话实际上就是在使用cookie。会话在高流量网站或服务器分布的网站上也可能不可行(每个服务器都有自己的会话条目)+1向Cookies发送海报是的,同意Cookies存储当前会话id,但COOKIE不用于此目的。如果我错了,你有任何链接来证明我错了吗?我在做$_SESSION['userId']=$row['user'];然后如果(isset($_SESSION['userId']){在mypage.php中,但是mypage.php即使输入的登录数据正确也不会显示任何内容,这意味着您的用户名和密码不正确。我想。在将值插入数据库时,您是否使用了sha1()若要将其转换为散列,您可以发布数据库表的屏幕截图吗?即使我打开了错误报告,也没有错误。即使在Firebug控制台中也没有错误。我是否必须在我的登录页面中向$\u会话['userId']=$row['user']添加任何其他内容?
    $\u会话['userId']
    最初不存在,仅当您的用户名和密码与数据库中的一个存储匹配时,才会创建它。如果您的用户名和密码匹配,则仅$\u会话['userId']将被创建。这就是您的情况,如果它不允许您访问该页面,这意味着$\u会话变量不存在或尚未创建,如果您可以发布数据库的屏幕截图,说明如何构建表,我可以为您提供更多帮助。您在做
    SESSION\u start();
    在php代码的开头?非常感谢!!这就是问题所在!