0

如标题所述,我遇到了 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 错误消息的情况下让它完全工作?任何帮助将非常感激!

4

3 回答 3

7

这里有一些错误,不能放在评论中。对不起,我看不出你的错误到底是什么,但如果你遵循第 1 点,它就会消失。

  1. 不要使用mysql图书馆。它已被弃用,并已在 PHP 5.5 中被删除(终于!)。它目前只对你有用,因为你的 PHP 版本已经过时了。您应该使用 PDO 或 MySQLi。查看这篇文章以获取有关 PDO 的信息:http: //net.tutsplus.com/tutorials/php/php-database-access-are-you-doing-it-correctly/

  2. 不要将您正在查看的脚本中未生成的任何变量放入查询中,这包括 SESSION 变量。您只需要应用程序中的一个缺陷,用户就可以将数据注入 SESSION。将每个变量都视为脏变量。如果你知道它不是——100% 肯定——那么就把它当作脏的。如果您在 PDO 或 MySQLi 中使用准备好的语句,这不是问题。

  3. 您应该通过他们的 ID 引用用户,而不是用户名。更快更安全。

  4. 永远不要md5()在数据库中存储原始密码或简单加密(如使用 plain )。至少,您可以使用以下内容进行加密:crypt($password, '$2a$07$sillystring' . sha1($password) . '$')并通过重新加密密码来验证它是否匹配。这是一种非常基本、更安全的方法。有很多关于密码加盐的文章更深入,值得一试。

于 2013-08-19T02:15:14.387 回答
1

除了康纳所说的,你这里有一个严重的问题:

    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()); 
    }
于 2013-08-19T02:20:28.610 回答
0

此代码段可以帮助您

$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 ver 5.5.0 之后,该库已被弃用

于 2013-08-19T02:26:53.033 回答