使用安全性在PHP中维护用户会话

时间:2011-10-18 15:20:51

标签: php session cookies sql-injection

我想知道开发人员如何专业地维护不同php文件之间的会话,因为用户可以浏览网站。

我已经看过所有教程,但我认为它们并不安全。

我刚刚创建了一个登录php文件,并创建了与userid,数据库中的用户名相关联的会话,如果记得我已经选中,它将创建一个cookie。

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);  
$rememberMe = (int)$_POST['rememberMe'];


$row = mysql_fetch_assoc(mysql_query("SELECT id,usr FROM members WHERE usr='{$username}' AND pass='".md5($password)."'"));

if($row['usr'])
{
  $_SESSION['usr']=$row['usr'];
  $_SESSION['id']=$row['id'];
  $_SESSION['rememberMe']=$_POST['rememberMe'];

  if($rememberMe=="on")
   setcookie('zsCookie',$username, time()+7200);


}

现在让我们说,我制作个人资料php。如何获得用户会话?我想知道开发人员在Facebook这样的网站上如何做到这一点的专业方式。获得此会话后,我如何使用它以完全安全的方式从我的数据库中检索值。

我的验证码是否可以安全地从sql注入?

3 个答案:

答案 0 :(得分:1)

您通常采用的方式是使用SESSIONS。

你可以做:

session_start();

在脚本的开头,然后使用:

$_SESSION['userid'] = $myuserid;

然后,当页面加载回来时,再次启动start_session()并查看$ _SESSION以查看您的用户ID是否存在。如果存在,请使用该用户ID从数据库加载用户数据。

例如:

'SELECT * FROM users_table WHERE id = '.$_SESSION['userid'];

请注意,您应该实现更多有关安全性的注意事项,请在php.net中查找会话部分以获取更多信息:

http://www.php.net/sessions/

祝你好运

答案 1 :(得分:1)

您的查询对SQL注入是安全的,尽管对$ _POST ['password']的mysql_real_escape_string调用是不必要的,因为当通过md5()运行时,输出将只包含字母数字字符并且不能包含SQL命令。

至于会议,这是另一回事。许多PHP开发人员通过使用在每个需要支持会话的页面上调用session_start()等函数来使用PHP的默认会话,并在$ _SESSION超全局中存储需要在每个页面上的信息。查看此处的会话的PHP文档:http://us3.php.net/manual/en/book.session.php

话虽如此,自定义会话实现可以实现更高的安全性和效率,但这需要更多的工作。

答案 2 :(得分:1)

你使用session_start()继续你的生活。

您的特定查询是安全的,但是要意识到当您通过md5运行字符串时,您在原始字符串上执行的任何SQL转义都会被销毁 - md5的输出字符集不包含sql元字符,因此如果用户的密码包含任何对于元字符,您现在不仅已经对其密码进行了哈希处理,而且还添加了任何转义字符。您必须执行此操作,无论您何时进行密码操作,否则您将最终获得特定用户PW的一个位置将无法工作,因为他们碰巧在pw中有一个SQL元数据。