【发布时间】:2011-10-22 06:38:35
【问题描述】:
我意识到已经有很多关于此的问题。但是我的方法和他们的不一样,所以我想知道。我想我了解 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;
}
所以用你最好的一击打我:)
而且我不认为我的方法尽可能有效。不幸的是,我对 php 的理解不够了解 $row = mysql_fetch_array($result) 正在做什么。
【问题讨论】:
-
SQL 注入是在为您的函数提供 $username 或 $password 的奇怪值时出现的。如果这些值来自外部提供的来源,那么您就有麻烦了。
-
@Ira Baxter,它来自 POST,所以我猜这意味着我遇到了麻烦?
-
考虑到有人可能会为用户名输入文本“' OR 'A=A”。然后你的循环会尝试所有用户的密码,我想。这将使猜测密码变得更容易。如果您的 SQL 允许在查询调用中使用多个语句,则用户名文本可能是 "'; DELETE * FROM 'users' 这将清除您的用户表,或者将某些用户的密码设置为特定密码的 UPDATE 语句,使使用该密码登录很简单。您需要检查的是检查用户名字符串是否包含引号。
-
我在这里为每个答案 +1。任何登陆此页面的人:使用准备好的语句没有缺点。并且您可以轻松入睡。
标签: php sql code-injection