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)不幸的是在做什么.
因为您正在使用任意字符串并将其直接放入SQL语句中,所以您很容易受到SQL注入攻击.
(根据以下评论编辑.)
SQL注入的经典示例是使用如下的用户名:
Robert'); DROP TABLE users;--
Run Code Online (Sandbox Code Playgroud)
说明:
给定上面的"用户名",插入字符串会导致:
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)
这将导致您的应用程序检索所有用户.