PHP 会话只使用一个密码字段(没有用户名)?

Posted

技术标签:

【中文标题】PHP 会话只使用一个密码字段(没有用户名)?【英文标题】:PHP Session using only a single PASSWORD field (no username)? 【发布时间】:2011-09-18 06:38:29 【问题描述】:

我一直在网上搜索有关创建脚本的好教程,该脚本允许某人使用“输入密码”字段,然后继续允许他们访问某些 php 页面。

我只能找到同时使用用户名和密码的教程(例如this tutorial- 但是我只是在寻找安全的东西,但只使用一个字段进行身份验证。

作为初学者,我唯一的想法是隐藏“用户名”字段,并使用实际用户名的值。但是我不确定这样做有多安全,因为我听说隐藏字段很危险,因为它们可以被利用?

我知道 SQL 注入,所以我希望找到至少足够强大的东西。

【问题讨论】:

您可以省略用户名字段吗?你能给我们看看代码吗? 根本没有用户名字段!将散列密码存储在数据库中,并将用户输入的散列值与存储在数据库中的值进行比较。如果匹配,则允许您访问。 你的意思是你只有一个密码,想让知道的人知道吗? 思南,是的,这正是我想要做的。 【参考方案1】:

好吧,不好的地方在于,使用用户名和密码,你必须知道组合,用户密码,只有密码,更容易找到,很多用户只会设置一些愚蠢的密码,比如: 654321 或出生日期之类的。

关于隐藏字段,请避免使用它们,但如果您确实需要它,请改用会话。

【讨论】:

这并没有特别回答这个问题。这似乎很疯狂,但我也有客户要求我提供此功能。我通常告诉他们这是一个愚蠢的想法,然后无论如何都要为他们做。它通常采用注册页面的形式,他们希望客户致电以获取一些“注册代码”,但这与他所询问的概念相同。【参考方案2】:

html

<form action='login.php' method="post">
  Password: <input type="password" name="password">
</form>

登录.php

<?php
// this password may come from any source.
// it's a variable for the sake of simplicity

$password = 'verySecretStuff';

if($_POST['password'] == $password)
  //handle login
else
  // handle no login

?>

【讨论】:

使用 === 运算符也是一个好主意。运算符似乎比 strcmp() 之类的函数快一点。不过这应该不是问题。【参考方案3】:

如果您只想使用密码,而不是用户名+密码的组合,您只需在教程中省略用户名部分,因此登录将如下所示:\

<?php
$password = 'unsafepassword1'; // received from a form post or whatever
$password = md5($password);

// Looking if this password is a valid password in the DB
$query = 'SELECT * FROM valid_passwords WHERE password = \''.$password.'\'';
IF(mysql_num_rows(mysql_query($query) == 1)
// user logged in

ELSE

// password was invalid

【讨论】:

【参考方案4】:

只需在 HTML 中输入一个内容(根本不需要用户名):

&lt;input type="password" name="password" /&gt;

并像往常一样查询数据库,只需要密码:

$password = $_POST["password"];
$result = mysql_query("SELECT password FROM passwords WHERE password='" . some_hash_function($password) . "'");
if(mysql_num_rows($result) > 0) 
    //There was a match

更新(基于问题的 cmets)

如果您希望只使用一个广为人知的密码就可以访问多个用户,只需将密码存储在您的 PHP 脚本中即可:

$password = "thePassword";
if(strcmp($password, $_POST["password"])) 
    //Matched

请注意,这不是特别安全...密码以纯文本形式存储在脚本中。但是,由于您似乎希望多个人知道密码,这可能是最简单的选择。我仍然建议使用数据库来存储单个密码。

【讨论】:

以上是关于PHP 会话只使用一个密码字段(没有用户名)?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 POST 数据发送到 PHP 中的另一个会话?

怎么用PHP+sqlite3验证登录用户名和密码

PHP会话系统脚本重新加载页面没有消息[重复]

为用户名和密码启动会话

这对于用户登录和验证是不是足够安全? (PHP、MySQL、会话)

在会话中存储密码是不是安全? [复制]