是我的PHP代码容易受到sql注入

时间:2013-12-11 12:59:02

标签: php sql security sql-injection

我的一位朋友告诉我,使用此脚本对用户进行身份验证对sql vulns来说是真正的风险

<?php
if(strlen(strstr($_SERVER['HTTP_USER_AGENT'],"-- IPB Vaidation  --")) <= 0 ){ 
die('Login Failed!, Please try again.');
}
$name = strtolower($_GET["name"]);
$password = $_GET["password"];
$digits = $_GET["digits"];
$random_number = 70; 
$sum_total2 = $digits * $random_number;
$con = mysql_connect("127.0.0.1","usernamehere","passhere");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
mysql_select_db("database here", $con);
$sql = "SELECT * FROM ipbmembers WHERE members_seo_name='{$name}'";
$result = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_array($result))
  {
  $trueHash = $row['members_pass_hash'];
  $salt = $row['members_pass_salt'];
  }
$hash = md5(md5($salt) . md5($password));
if($hash == $trueHash)
{
echo "Thank you for logging in";
echo ($sum_total2);
}
else
{
echo "Login Failed!, Please try again.";
echo ($sum_total2);
}  
?>
谁能告诉我它是如何完成的?或者我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

是的,您的代码容易受到攻击。看看这句话:

$sql = "SELECT * FROM ipbmembers WHERE members_seo_name='{$name}'";

如果$name的值为'; DROP TABLE ipbmembers; --,该怎么办?然后,您构建的SQL语句将是:

SELECT * FROM ipbmembers WHERE members_seo_name=''; DROP TABLE ipbmembers; --'

您将执行SELECT,然后执行DROPping table。

不要从外部变量构建SQL。使用占位符和预准备语句。

答案 1 :(得分:0)

您的代码容易受到攻击。我最近使用你现在使用的东西切换到PDO。 Google PDO并对其进行了一些研究,但这是使用PDO保护SQL代码所需的内容:

$sql= $conn->prepare('SELECT * FROM ipbmembers WHERE members_seo_name=:name');
$sql->bindParam(':name', $name);
$sql->execute();
while($row = $sql->fetch())
{
$trueHash = $row['members_pass_hash'];
$salt = $row['members_pass_salt'];
}

该代码将执行您正在执行的操作,但事先准备好sql语句,然后只要使用$sql->execute(); Here is a great article that explains more in detail what is happening.执行语句,就会使用值代替placehoders

我还建议您对传入的变量使用$name=htmlspecialchars($name,ENT_QUOTES) $password=htmlspecialchars($password,ENT_QUOTES)$digits=htmlspecialchars($digits,ENT_QUOTES)吗?这将防止用户添加javascript代码或其他代码来混淆这些变量。在学习SQL注入时我也选择了它。