这容易受到SQL注入的影响

Aus*_*tin 1 php sql code-injection

我意识到这方面已经有很多问题了.但我的方法和他们的方法不一样,所以我想知道.我想我理解SQL,但我不想冒将来犯错的风险,所以感谢任何帮助.(这只是我正在做的一个项目,不是家庭作业或任何重要的事情).

function checkLogin($username, $password) {
    $username = strtolower($username);
    connectToDatabase();
    $result = mysql_query("SELECT * FROM `users` WHERE username='$username'");
    $dbpassword = "";
while($row = mysql_fetch_array($result))
  {
    $rowuser = $row['username'];
  if($username != $row['username']) continue;
  $dbpassword = $row['password'];
  }
    if($dbpassword == "") {
        return false;
    }
    $genpass = generatePassword($password);
   return $genpass == $dbpassword;
}
Run Code Online (Sandbox Code Playgroud)

因此,用你最好的镜头打我:)我不认为我的方法尽可能高效.我不明白php足以理解$row = mysql_fetch_array($result)不幸的是在做什么.

Ray*_*oal 6

因为您正在使用任意字符串并将其直接放入SQL语句中,所以您很容易受到SQL注入攻击.

(根据以下评论编辑.)

SQL注入的经典示例是使用如下的用户名:

Robert'); DROP TABLE users;--
Run Code Online (Sandbox Code Playgroud)

强制性的XKCD链接

说明:

给定上面的"用户名",插入字符串会导致:

SELECT * FROM `users` WHERE username='Robert'); DROP TABLE users;--'
Run Code Online (Sandbox Code Playgroud)

最后的注释符号--需要"摆脱" 你的结束语,因为我只是替换了我的一个结束你的select语句,以便我可以注入一个DROP TABLE语句.

正如@sarnold指出的那样,PHP mysql_query只执行字符串中的第一个查询,因此上面的示例(称为查询堆栈)不适用.该函数在这里解释:http://php.net/manual/en/function.mysql-query.php.

这里可以找到一个更好的例子.他们在这里使用的是用户名

' OR 1 OR username = '
Run Code Online (Sandbox Code Playgroud)

内插成为

SELECT * FROM `users` WHERE username='' OR 1 OR username = ''
Run Code Online (Sandbox Code Playgroud)

这将导致您的应用程序检索所有用户.