任何人都可以看到此登录脚本有任何问题:
public function login($username, $pass, $remember) {
// check username and password with db
// else throw exception
$connect = new connect();
$conn = $connect->login_connect();
// check username and password
$result = $conn->query("select * from login where
username='".$username."' and
password=sha1('".$pass."')");
if (!$result) {
throw new depException('Incorrect username and password combination. Please try again.');
} else {
echo $username, $pass;
}
解释:
目前剧本允许任何通过。换句话说,对于传递给它的任何用户名和密码,查询返回true。 我把echo语句作为一个检查 - 显然脚本会在正常情况下继续!
我知道connect类和login_connect
方法正在运行,因为我在一个工作正常的寄存器脚本中使用它们。 depException只是Exception类的扩展
函数login()是包含工作正常的register()的同一个类的一部分
我知道这两个变量($ username和$ pass)正在进入函数,因为echo语句正在准确地输出它们。 (脚本的这一部分不需要$ remember变量。以后用它来记住我的过程。)
我很难过。请帮忙!
感谢您的回复。我对查询返回的内容感到困惑。完整的脚本会检查返回的行数,这是检查应该完成的位置。现在一切都在工作,除了我记得我的功能。也许有人可以帮忙吗?!?!这是完整的脚本:
public function login($username, $pass, $remember) {
// check username and password with db
// else throw exception
$connect = new connect();
$conn = $connect->login_connect();
// check username and password
$result = $conn->query("select * from login where
username='".$username."' and
password=sha1('".$pass."')");
if (!$result) {
throw new depException('Incorrect username and password combination. Please try again.');
}
if ($result->num_rows>0) {
$row = $result->fetch_assoc();
//assign id to session
$_SESSION['user_id'] = $row[user_id];
// assign username as a session variable
$_SESSION['username'] = $username;
// start rememberMe
$cookie_name = 'db_auth';
$cookie_time = (3600 * 24 * 30);*/ // 30 days
// check to see if user checked box
if ($remember) {
setcookie ($cookie_name, 'username='.$username, time()+$cookie_time);
}
// If all goes well redirect user to their homepage.
header('Location: http://localhost/v6/home/index.php');
} else {
throw new depException('Could not log you in.);
}
}
非常感谢你的帮助。
更新2!
感谢您的帮助,我已经掌握了此脚本的主要部分。但是,记住我最后的一点仍然不想工作。 有人可以帮我解决一下吗? $ username,$ pass和$ remember都是我在将它们传递给函数之前分配的短变量名,以便每次都保存写入$ _POST ['username']等。 $ remember指的是一个复选框。
答案 0 :(得分:4)
$conn->query()
返回什么,像mysql_query()
这样的MySQL资源对象呢?如果是这样,它将始终比较“真实”。如果查询完全失败,mysql_query()
仅返回FALSE
,例如语法错误或表不存在。
要检查您是否有任何结果,您需要尝试从结果集中获取一行,看看您是否获得了任何内容,通过mysql_fetch_row()
的等效内容。
重要提示:您的脚本容易受SQL injection attacks攻击,甚至只有奇怪的用户名如o'neil
和撇号。您应该使用mysql_real_escape_string()
(或等效的)转义查询中的所有变量,以确保您的查询不会被特殊字符弄乱。或者,更好的是,使用看似
select * from login where username=? and password=sha1(?)
重新:更新
表单中的变量可通过$_GET
或$_POST
获得,具体取决于用于提交表单的方法。请尝试if (isset($_POST['remember']))
查看是否已选中该复选框。
重要提示:我发现您尝试使用裸$remember
来查看复选框是否已选中。这告诉我你正在尝试利用PHP中的register_globals
功能,它可以通过常规变量名访问你的GET和POST变量。如果是这种情况,您应该注意PHP手册中的警告!
警告
[
register_globals
]自PHP 5.3.0起已被弃用,自PHP 6.0.0起已被删除。非常不鼓励依赖此功能。
改为使用$_GET
和$_POST
。实际上,我可以告诉你如何让if ($remember)
工作,但考虑到register_globals
的内在邪恶,我不会这样做! ; - )
答案 1 :(得分:3)
您的查询已针对sql-injections ...
开放SELECT *
FROM users
WHERE username =''或'a'='a '
和密码= SHA1( '的 guessAnyPassword 强>')
我还会检查您的结果,并根据返回的记录数量确定操作。
if (mysql_num_rows($result) > 0)
答案 2 :(得分:0)
在php中,如果执行错误,则大多数查询仅返回False。您的查询返回一个值,可能是一个空数组值。就if语句而言,这不是假值。
检查返回的行数。执行此操作的功能取决于您的抽象层(连接类等...)