2010-08-28 152 views
7

下面是其安全登录是要实现的登录系统/PHP安全登录 - 密码加密

main_login.php 

    <form name="form1" method="post" action="checklogin.php"> 
    Username:<input name="myusername" type="text" id="myusername" /> <br /> 
    Password:<input name="mypassword" type="password" id="mypassword" /> 
    <input type="submit" name="Submit" value="Login" /> 
    </form> 

Checklogin.php

<?php 
ob_start(); 
$host="localhost"; // Host name 
$username="root"; // Mysql username 
$password=""; // Mysql password 
$db_name="cosmos"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse. 
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

// Define $myusername and $mypassword 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

// To protect MySQL injection (more detail about MySQL injection) 
$myusername = stripslashes($myusername); 
$mypassword = stripslashes($mypassword); 
$myusername = mysql_real_escape_string($myusername); 
$mypassword = mysql_real_escape_string($mypassword); 

$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'"; 
$result=mysql_query($sql); 

// Mysql_num_row is counting table row 
$count=mysql_num_rows($result); 
// If result matched $myusername and $mypassword, table row must be 1 row 

if($count==1){ 
// Register $myusername, $mypassword and redirect to file "login_success.php" 
session_register("myusername"); 
session_register("mypassword"); 
header("location:login_success.php"); 
} 
else { 
echo "Wrong Username or Password"; 
} 

ob_end_flush(); 
?> 

login_success.php

<?php 
session_start(); 

if(isset($_SESSION['username']) && ($_SESSION['username'] == $myusername)){ 
header("location:main_login.php"); 
} 
?> 

<html> 
<body> 
Login Successful. <a href="logout.php">Logout</a> 
</body> 
</html> 

logout.php

<?php 
session_destroy(); 

header("location:main_login.php"); 
?> 

问题是我想通过密码加密或任何其他方法(如果有的话)进行此安全登录。我是初学者到PHP

+1

你想要加密的是什么,为什么? – 2010-08-28 09:29:16

+2

您应该在密码输入字段中使用“密码”类型。 – Gumbo 2010-08-28 09:31:03

回答

5

您可以加密的密码使用MD5学位。您将需要从当用户注册和登录MD5之前....

例MD5密码: // Define $myusername and $mypassword $myusername=$_POST['myusername']; $mypassword=$_POST['mypassword']; $mypassword = md5($mypassword);

您还需要只要你有一个用户注册使用这个。

+0

这是可怕的不安全。你应该使用更强大的哈希算法(比如bcrypt)。你的代码也容易受到sql注入的影响。 – CountMurphy 2017-11-02 16:02:01

2

为了使这个更安全一点,你应该在数据库中存储加密的密码,然后比较加密的输入密码和存储的散列。这样,如果有人以某种方式访问​​成员表,他们不能看到实际的密码。

假设密码是myPassword那么不要只是存储它,首先使用像md5这样的算法对其进行散列,然后在数据库中存储散列值为deb1536f480475f7d593219aa1afd74c。然后当用户输入密码时,对其进行散列并比较两个散列。

要获得更安全的方法,请使用SSL

+1

加密是可逆的;这不是一个好主意。更好地使用哈希。 – Gumbo 2010-08-28 09:33:46

1

通常情况下,您会在数据库中存储密码的散列,请参阅md5但是,这并不能保证网页和服务器之间的安全 - 为此,您需要使用https。

这里有两件事。

1. 如果我是个笨手笨脚的用户,当我注册您的网站时,我必须输入密码我可能会给出与我在其他地方使用的密码相同的密码,所以您的网站应该真的存储密码的哈希值真实的东西,所以如果他们被黑客攻击者不会得到我在任何地方使用的密码。为此,您将散列存储在您的成员表中,并在查询中检查它是否有效,而不是传递散列值。

2. 在http下,密码将以纯文本形式从浏览器发送到服务器。如果这是通过互联网并且攻击者可以访问浏览器和客户端之间的任何网络,那么他们可以看到密码 - 如果您使用JavaScript将其哈希在浏览器中,攻击者可以拿起哈希并且可能使用它来登录您的网站。这就是为什么我们有https。对于低成本(特别是与开发成本相比),您可以购买证书来保证连接的安全。如果你不想这样做,你可以自己签署证书并使用它。如果您的托管服务不允许您使用证书,那么可能会创建一个家庭冲煮解决方案,但是找到其他托管服务会更好。

+0

好吧我在这个 真的很糟糕,但我想知道,如果例如由于某种原因,我没有访问SSL,那么我如何使用散列方法?我的意思是我必须使用md5函数创建一个注册页面,所有的,你能解释一下... – 2010-08-28 09:29:11

+0

@tune无论如何SSL没有任何关系。它是受保护的密码存储,而不是每个人都在谈论的登录系统。 – 2010-08-28 09:34:39

+0

看到我的编辑 - 但正如其他人提到的,也许你应该尝试一些开源的CMS之前,试图实现自己的。 – 2010-08-28 19:07:01

2

将注册数据插入表时,可以使用md5($ password)或sha1($ password)。

再次匹配登录登录

$ SQL = “SELECT * FROM $ tbl_name其中username = '$名为myUsername' 和密码= '”“'MD5($输入mypassword)。'; $ result = mysql_query($ sql);

还有一些其他的方式,以进一步保护。使用sha1和盐的组合。

顺便说一句,为什么不使用一些快速的PHP框架因为这些小东西已经与他们一起构建。

谢谢

+3

@tunetosuraj:你是一个PHP初学者时正在构建一个CMS吗?你如何建议使用你自定义的开源CMS来满足他们的需求? – 2010-08-28 09:44:06

4

作为一个初学者,很可能你不需要任何加密。特别是因为它会是Javascript,而不是PHP。
虽然可以做到。
你可以使用实现摘要式身份验证模式散列挑战

  • 服务器发送一个挑战 - 一个随机strimg
  • 客户端使这一挑战的哈希和密码
  • 这个散列发送到服务器
  • 服务器以相同的方式做一个哈希值并比较两者

有很多Javascript MD5哈希算法实现在内部净。

当然,SSL证书比这个自制的实现更受欢迎。

但是,要得到正确的答案,您仍然需要阐明您想要加密的原因以及原因。你为什么不关心保护别的东西。例如您的整个数据库。

一段时间的笔记。
您的login_success代码可能无法正常工作并且无法保护。
这应该只是

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

因为没有$名为myusername变量比较。
还有应该是exit;之后header("location:...
或客户将得到保护的内容,反正

+2

自制的执行可以通过中间人攻击来击败。尽管如此,它仍然可以防止窃听。 – 2010-08-28 09:46:03

+0

@Georg怎么来的?我看不到 – 2010-08-28 09:53:53

+0

中间人可以修改发送给客户端的Javascript(例如,删除加密代码)或者构成服务器。真正的SSL安全连接与证书一起工作,以确保您与之通话的服务器确实是您想要与之通话的服务器。 – 2010-08-28 11:06:23

2

您应该使用

$static_salt='asdfasdfqwertyuiop123ABC_some_static_salt_string'; 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 
$mypassword=hash('sha512', $mypassword . $static_salt . $myusername); 

您必须存储哈希密码哈希和任何密码,你把它们比作存储的一个前。 MD5是不适合散列密码,请参阅: http://uk1.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash 你也应该考虑使用salts

+0

散列算法SHA *既不适合哈希密码,尤其是不像您的示例那样未哈希。它们速度太快,而是使用像BCrypt或PBKDF2这样的慢速密钥派生函数。 – martinstoeckli 2014-03-22 21:21:20

+0

我同意如果你看看我的答案中包含的两个链接,PHP文档讨论了合适的哈希算法,但我认为sha512比sha1更好,所以我会改变我的答案,并且还提供了一个链接盐的信息,我也会在我的答案中加入。 – nettux443 2014-03-28 14:13:16

+1

我知道你只想提高接受的答案,但这是一个很老的线索,最好在对答案的评论中指出这一点。您的示例仍然是一种非常不安全的密码散列方式,静态盐不能算作盐,而SHA512仍然不合适。我想邀请你阅读我的关于[安全密码存储]的教程(http://www.martinstoeckli.ch/hash/en/index.php)。 – martinstoeckli 2014-03-28 16:39:55

0

MD5是在这种情况下最好的。通过MD5函数运行密码等输入详细信息并插入数据库。

它几乎不可修改,所以使用它的唯一方法是在登录时也使用MD5,并将登录时的md5密码与存储在数据库中的版本进行比较。