Php登录系统,如何保护它
这里有个php新手。 下面是我用来构建登录系统以进入mypage.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_
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代码的开头?非常感谢!!这就是问题所在!