我在我的网站上使用的PHP登录脚本出错了。
我想添加一些代码,用于检查用户在登录时是否被禁止。
但由于某些原因,它不能正常工作;即使禁止字段/属性在MySQL“users”表中包含“n”为false,它也总是输出“你被禁止”。
我已经尝试修复代码,但我仍然遇到错误。这是我的代码:
$bancheck = mysql_query("SELECT * FROM users WHERE ban = '".$_POST['username']."'" ) or die(mysql_error());
$ban = mysql_fetch_array($bancheck);
if ($ban = 'y') {
die('You are banned...');
}
我要检查的MySQL字段称为“禁止”,值为“y”表示“true”,或“n”表示“false”。
答案 0 :(得分:5)
此行不正确:
if ($ban = 'y') {{
应该是:
if ($ban == 'y') {
我假设那里也有一个额外的支撑。
您不应将字符串from $_POST
直接传递到MySql中,因为您容易受到SQL注入攻击。你应该像这样逃避:
$bancheck = mysql_query("SELECT * FROM users WHERE ban = '".mysql_real_escape_string($_POST['username'])."'" )or die(mysql_error());
你不应该将ban
与通过表单传入的用户名进行比较,因为ban会保留字符串'y'或'n'。您应该将用户名(传入)与数据库表中的approriate username字段进行比较。像这样:
$bancheck = mysql_query("SELECT * FROM users WHERE username = '".mysql_real_escape_string($_POST['username'])."'" )or die(mysql_error());
我使用mysql_fetch_array()
函数而不是mysql_fetch_assoc()
函数,因为它返回associative array。
这将为返回的每一行(包含在MySql资源$bancheck
中)返回一个关联数组,因此您需要迭代它们(即使它应该只返回一个数组),如下所示:
while($ROW = mysql_fetch_assoc($bancheck))
{
if('y' == $ROW['ban']) {
die('You are banned...');
}
}
但是我会添加一些代码来帮助解决任何其他问题:
$count = mysql_num_rows($bancheck);
if($count > 1)
{
die('More than one user with that username');
}
elseif($count > 0)
{
while($ROW = mysql_fetch_assoc($bancheck))
{
if('y' == $ROW['ban']) {
die('You are banned...');
}
}
}
else //i.e. $count<=0
{
die('No users with that username');
}
答案 1 :(得分:0)
if ($ban = 'y') {{
应该是
if ($ban == 'y') {
答案 2 :(得分:0)
$bancheck = mysql_query("SELECT * FROM users WHERE ban = '".$_POST['username']."'" )or die(mysql_error());
我认为应该是:
$bancheck = mysql_query("SELECT ban FROM users WHERE username = '".$_POST['username']."'" )or die(mysql_error());
如果username的列名为“username”
答案 3 :(得分:0)
答案 4 :(得分:0)
$bancheck = mysql_query("SELECT banned FROM users WHERE username = '". mysql_real_escape_string($_POST['username']) ."'") or die(mysql_error());
$ban = mysql_fetch_array($bancheck);
if($ban['banned'] == 'y') {
die('You are banned...');
}
banned
($ban['banned']
)的字段为“y”或“n”。
但是检查$_POST['username']
是否有mysql注入尝试。见https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
答案 5 :(得分:0)
回顾和扩展,SQL WHERE子句中的赋值/比较和错误的列是任何人都会犯错的错误。但是,代码片段仍然存在。
The PHP documentation for mysql_fetch_array表示该函数返回一个数组,其中包含数据库内部指针所在的行,而不仅仅是单个值。
我会做这样的事情
$username = do_some_injection_checking_or_escaping($_POST['username']);
$bancheck = mysql_query("SELECT * FROM users WHERE username = '".$username."' AND ban='y';") or die(mysql_error());
if(mysql_num_rows($bancheck) == 1) {
die('You are banned...');
}
如果您只是需要检查某些内容并且您不需要数据,这是一个很好的方法。