如标题所述,我遇到了一个SQL注入错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' at line 1
我该如何解决这个问题?下面提供的是我的php代码和html代码
PHP:
if($_POST['submit']=='Change')
{
$err = array();
if(!$_POST['password1'] || !$_POST['passwordnew1'])
$err[] = 'All the fields must be filled in!';
if(!count($err))
{
$_POST['password1'] = mysql_real_escape_string($_POST['password1']);
$_POST['passwordnew1'] = mysql_real_escape_string($_POST['passwordnew1']);
$row = mysql_fetch_assoc(mysql_query("SELECT id,username FROM members WHERE username='{$_SESSION['username']}' AND pass='".md5($_POST['password1'])."'"));
if($row['username'])
{
$querynewpass = mysql_query("UPDATE members SET pass='".md5($_POST['passwordnew1'])."' WHERE username='{$_SESSION['username']}'");
$result = mysql_query($querynewpass) or die(mysql_error());
}
else $err[]='Wrong Password To Start With!';
}
if($err)
$_SESSION['msg']['passwordchange-err'] = implode('<br />',$err);
header("Location: members.php?id=" . $_SESSION['username']);
exit;
}
HTML:
<form action="" method="post">
<?php
if($_SESSION['msg']['passwordchange-err'])
{
echo '<div class="err">'.$_SESSION['msg']['passwordchange-err'].'</div>';
unset($_SESSION['msg']['passwordchange-err']);
}
if($_SESSION['msg']['passwordchange-success'])
{
echo '<div class="success">'.$_SESSION['msg']['passwordchange-success'].'</div>';
unset($_SESSION['msg']['passwordchange-success']);
}
?>
<label class="grey" for="password1">Current Password:</label>
<input class="field" type="password" name="password1" id="password1" value="" size="23" />
<label class="grey" for="password">New Password:</label>
<input class="field" type="password" name="passwordnew1" id="passwordnew1" size="23" />
<input type="submit" name="submit" value="Change" class="bt_register" style="margin-left: 382px;" />
</form>
我让它在用户可以更改/更新密码的地方工作,但是,当他们单击表单上的"更改"按钮时,他们会被引导到我在上面发布的错误消息,如果他们单击刷新按钮,只有这样他们才会被重定向回他们的个人资料,并且已经进行了更改。所以我手头的主要问题是,在没有mysql错误消息的情况下,我如何让它完全工作?任何帮助都将不胜感激!
这里有一些错误,超出了注释的范围。很抱歉,我看不出你的错误是什么,但如果你遵循第1点,它就会消失。
-
不要使用
mysql
库。它已被弃用,并已在PHP 5.5中删除(最终!)。它目前只对你有效,因为你的PHP版本已经过时了。您应该使用PDO或MySQLi。查看本文了解PDO的信息:http://net.tutsplus.com/tutorials/php/php-database-access-are-you-doing-it-correctly/ -
不要将您正在查看的脚本中未生成的任何变量放入查询中,这包括SESSION变量。您只需要在应用程序中有一个缺陷,用户就可以将数据注入SESSION。将每个变量都视为脏变量。如果你知道它不是——100%肯定——那么就把它当作肮脏的东西。如果您将准备好的语句与PDO或MySQLi一起使用,这不是问题。
-
您应该根据用户的ID而不是用户名来引用用户。更快更安全。
-
永远不要将原始密码或简单加密的密码(如普通
md5()
)存储在数据库中。至少,您可以使用类似crypt($password, '$2a$07$sillystring' . sha1($password) . '$')
的东西进行加密,并通过重新复制密码进行验证,看看它是否匹配。这是一种非常基本、更安全的方法。有很多关于密码盐析的文章更深入,值得一看。
除了Connor说的,你在这里有一个严重的问题:
if($row['username'])
{
$querynewpass =
mysql_query("UPDATE members SET pass='".md5($_POST['passwordnew1']).
"' WHERE username='{$_SESSION['username']}'");
$result = mysql_query($querynewpass) or die(mysql_error());
}
第一个内部行已经执行mysql_query,并返回一个资源,该资源分配给$querynewpass。
您正在将结果(资源)重新发送到另一个查询,就好像它是包含要执行的SQL命令的字符串一样。
这是功能的规范:
resource mysql_query ( string $query [, resource $link_identifier = NULL ] )
这是mysql_query的正确用法(正如人们所提到的,它已被弃用):
if($row['username'])
{
$querynewpass =
"UPDATE members SET pass='".md5($_POST['passwordnew1']).
"' WHERE username='{$_SESSION['username']}'";
$result = mysql_query($querynewpass) or die(mysql_error());
}
这个代码片段可以帮助您
$pass1 = md5(mysql_real_escape_string($_POST['password1']));
$newpass = md5(mysql_real_escape_string($_POST['passwordnew1']));
$username = mysql_real_escape_string($_SESSION['username'])
$query = "SELECT id,username FROM members WHERE username = '$username' AND pass = '$pass1'";
$result = mysql_query($query); //that could also use , mysql_query($query,$yourconnection);
if(mysql_num_rows($result)>0)
{
$updatequery = "UPDATE members SET pass='$newpass' WHERE username='$username'";
$updateresult = mysql_query($updatequery) or die(mysql_error());
}
请注意,mysql
库在php版本5.5.0之后的中已弃用