我的php代码易受sql注入攻击吗

我的php代码易受sql注入攻击吗,php,sql,security,sql-injection,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

我的一个朋友告诉我,使用此脚本对用户进行身份验证对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);
}  
?>

有人能告诉我是怎么做的吗?或者我做错了什么


谢谢

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

$sql = "SELECT * FROM ipbmembers WHERE members_seo_name='{$name}'";
如果
$name
的值为
”,该怎么办;下拉表IPB成员--?然后,您生成的SQL语句将是:

SELECT * FROM ipbmembers WHERE members_seo_name=''; DROP TABLE ipbmembers; --'
您将进行选择,然后删除该表


不要从外部变量生成SQL。使用占位符和准备好的语句。

您的代码易受攻击。我最近从使用您现在使用的东西切换到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()执行语句时,都会将值放在placehoders的位置


我还建议在传入变量上使用
$name=htmlspecialchars($name,entu引号)
$password=htmlspecialchars($password,entu引号)
$digits=htmlspecialchars($digits,entu引号)
?这将防止用户添加javascript代码或其他代码来处理这些变量。在学习SQL注入时,我也学到了这一点。

是的,您直接将变量注入SQL语句,甚至没有尝试转义它们。您还使用了不推荐使用的mysql_uu函数,移动到mysqli或pdo,交换到使用准备好的语句,您会更加安全。这是一个比我最近向人们指出的这个网站更重要的问题,它是一个完善的网站,解释了SQL注入的问题,它是如何完成的,以及如何在大量编程语言中修复。您是否尝试过查看如果输入“Thomas O'Malley”这样的名称会发生什么情况?使用PDO或mysqli进行安全保护。(快速提问安迪)。如果这种情况真的发生了,难道不能添加一个过滤器来嗅出是否有人输入了“DROP”和/或“TABLE”,并在到达该阶段之前使其
die()
。为什么要做错事,当你可以很容易地做对的时候——通过使用事先准备好的陈述。我100%同意,这只是一个一直在我脑海中的问题。我总是使用事先准备好的陈述;我只是好奇@user1615903我从不相信用户输入。@Fred ii-:当然你可以嗅出DROP或TABLE,但是INSERT或COPY或其他任何东西呢?如果攻击者插入的代码是SELECT语句,需要进行完整的表扫描,从而有效地导致拒绝服务攻击,该怎么办?更好的办法是防范一切攻击,而不是在编写代码时想到的攻击。@AndyLester你说得有道理,我没有想到这一点。感谢添加的知识Andy.PS:将其添加到php中,以便使用PDO连接到数据库
$conn=new PDO(“mysql:host=host;dbname=dbname”,用户名,密码)$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常)