2016-02-04 59 views
-4

我目前有一个PHP登录系统,它通过验证用户输入的组织代码进行登录,因此查询的数据库将会不同。如何以更安全的方式检查PHP会话?

includes.php

<?php 

mysql_connect("mysql.example.com", $dbconn, "MySecurePassword"); 
mysql_select_db($dbconn); 

?> 

login.php

// $org is the Organisation Code, will be set when user clicks Login 

$dbconn = $org; 
include "includes.php"; 

// Omitted the $userid & $pw variables, assume there is no error, and that MySQL Injection is prevented already 

    $query = "SELECT * FROM `Login` WHERE `userid`=TRIM('$userid') AND `password`=TRIM('$pw')"; 

    $result = mysql_query($query); 

    if(mysql_num_rows($result)>0){ 

     session_start(); 
     $_SESSION['logged_in'] = $username; 
     header("Location: loggedinpage.php"); 

    } 

loggedinpage.php

<?php 

session_start(); 

// As there is no fixed database, I've omitted the DB Connection 

define('DS', TRUE); // used to protect includes 
define('USERNAME', $_SESSION['logged_in']); 
define('SELF', $_SERVER['PHP_SELF']); 

// Checks if user is logged in 
if (!USERNAME) { 
    header("Location: login.php"); 
} 

?> 

保障措施采取

  • 密码使用SHA-512进行散列处理,而不是以纯文本形式存储。

  • MySQL的注射用mysql_real_escape_string()

我省略为便于一些代码来阅读阻止,我可以知道,如果用户登录检查的方式是安全的?如果不是,我该如何改进?

在此先感谢!

  • 更新的问题,以反映的意见更新
+2

这几乎是如何完成的。你可以代替'SELECT *',运行'SELECT 1'。那么你没有检索数据库信息,因为你没有使用它。也可以使用'mysql_'函数退出,改为使用'mysqli_'。并且不要忘记逃避所有的用户输入。 – Phiter

+2

一个主要的方法是切换到使用参数化查询 –

+0

检测用户是否安全登录的方式?谢谢! – Panda

回答

2

假设按照预期,只有当返回的比赛是完全正确的一排(例如,通过整理规则没有怪异的模糊匹配查询工作,但纯bin比较),认证部分是非常好的。

(你被警告过大量的SQL注入,你自己在那里。)

您的安全,然后归结为:

$_SESSION['logged_in'] = $username; 

和后续:

define('USERNAME', $_SESSION['logged_in']); 

if (!USERNAME) { 
    header("Location: login.php"); 
} 

我想你的问题是关于这一部分。
然后答案是:会话部分是好的,阻塞不是。

这就是如何使用会话,是的,他们默认情况下是合理安全的;用户将无法以某种方式自己设置$_SESSION['logged_in']值,该值只能由您的服务器设置,并且大概只有在成功验证时才这样做。请阅读会话劫持,这是整个方案唯一真正的漏洞。

真正的问题是:

if (!USERNAME) { 
    header("Location: login.php"); 
} 

设置的标头不终止当前页面。如果您在此行之后输出敏感信息,它会将发送给客户端!设置标题后,您需要明确指定exit

说完这一切后,我们无法告诉您您的系统是否“安全”,因为可能有您创建的我们没有看到的任何数量的后门程序。总的来说,我会跟下面的启动:

  • 停止使用mysql,使用PDOmysqli
  • 绑定您的参数,不要mysql_real_escape_string他们。那里有安全隐患
  • 使用password_hash密码散列,而不是SHA;特别是如果你只做一个单一的SHA通道
+0

谢谢!这就是我一直在寻找的东西。 – Panda

1

becareful SQL注入:

如果您在密码字段中键入:

''='' 

密码的规则将是真实的,因为密码= TRIM(''='')为真。你必须控制密码的字符串:

  • 最小长度
  • 没有空格(感谢修剪功能)

而且你不必来存储这样的密码,你必须做出密码的哈希

+0

谢谢!我已经阻止了MySQL注入。 – Panda