php - 我的 php 代码是否容易受到 SQL 注入(inject)攻击

标签 php sql security sql-injection

我的一个 friend 告诉我,使用这个脚本来验证用户身份对 SQL 漏洞来说是真正的风险

<?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的值为'怎么办?删除表 ipbmembers; --?那么您构建的 SQL 语句将是:

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

您将执行 SELECT,然后删除表。

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

关于php - 我的 php 代码是否容易受到 SQL 注入(inject)攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20519794/

相关文章:

mysql - 使用 WHERE 条件从多个表更新表

mysql - 获取两个日期之间的记录(时间戳)时出现问题

ruby-on-rails - 当在HTTP header 而不是cookie中找到加密值时,如何解密 `.signed`?

macos - 如何使 libcurl 在 Mac 钥匙串(keychain)中查找证书

php - 使用过滤器根据类别进行搜索

PHP获取文件夹/子文件夹中每个文件的路径到数组中?

SQL - 创建月份第一天和月份名称的临时表或 CTE

security - 不使用 cookie 的 "remember my device"的替代实现?

php - 使用 PHP 销毁所有 session 变量

php - 图像根据其大小的动态位置