【问题标题】:How can I avoid SQL injection in my code below? [duplicate]如何在下面的代码中避免 SQL 注入? [复制]
【发布时间】:2015-01-06 16:31:02
【问题描述】:

我一直在思考如何避免对我的代码进行 SQL 注入攻击。

这就是我现在所拥有的。

<?php
session_start();
$email = $_POST['e-mail'];
$fn = $_POST['firstname'];
$ln = $_POST['lastname'];
$cp = $_POST['cellphone'];
$phn = $_POST['phone_number'];
$comp = $_POST['company'];
$prov = $_POST['province'];
$brgy = $_POST['barangay'];
$fadd = $_POST['address'];
$sadd = $_POST['address2'];

$conn = mysqli_connect('localhost','root','','newcartdb')or die('Could not connect');

foreach($_POST['product'] as $product)
{
    $date = date('Y-m-d H:i:s');
    $order_name = $product['item_name'];
    $order_code = $product['item_code'];
    $order_qty = $product['item_qty'];
    $sub_total = $product['price'];

    $query = "INSERT INTO `newcartdb`.`orders`(`Email`,`Firstname`,`Lastname`,`ContactNum`,`PhoneNum`,`Company`,`Province`,`Barangay`,`FAddress`,`SAddress`,`ProductName`,`ProductCode`,`Qty`,`SubTotal`,`datetime`) VALUES('$email','$fn','$ln','$cp','$phn','$comp','$prov','$brgy','$fadd','$sadd','$order_name','$order_code','$order_qty','$sub_total','$date')";
    mysqli_query($conn,$query);
}



mysqli_close($conn);

header('Location: order_confirmation.php');
?>

我该如何改进?

【问题讨论】:

  • 您为什么不使用搜索工具自行查找信息?你用MySQLi,你用PHP,不难找“php mysqli sql注入预防”。

标签: php mysql mysqli sql-injection


【解决方案1】:

正如建议的那样,prepared statements 是实现良好防止 SQL 注入的最佳方法。

简化示例

您需要添加条目以填写您希望插入的所有列。

$email = $_POST['e-mail'];
$fn = $_POST['firstname'];
$ln = $_POST['lastname'];

if ($stmt = $mysqli->prepare("INSERT INTO `newcartdb`.`orders`(Email,Firstname,Lastname) values(?,?,?)") {
    $stmt->bind_param("sss",  $email, $fn, $ln);

“sss” - 表示数据类型,即“s” - 字符串,“i” - 每个条目的整数。

values(?,?,?) - 这是 bind_params 语句的占位符,所以 '?'将按顺序替换为您在 bind_params 方法中放置的值

    $stmt->execute();

    $_SESSION['notice'] = "Table updated";
}

else{
    $_SESSION['notice'] = "Table could not be updated!";
}

【讨论】:

  • 先生,您所说的 (?,?,?) 是什么意思。我需要在里面放点东西吗?变量还是我需要那样输入? :)
  • 使用准备好的语句?是占位符,当命令执行时,它将采用元素,即(“sss”,$email,$fn,$ln);并替换“?”与放置在 bind_params 方法中的变量按顺序排列,所以不需要替换它。
  • 啊。我得到了它。如果我有 7 个变量,那么我必须在里面放 7 个问号,对吗?现在我知道为什么它是“?”让黑客不知道。 :D 我今天学到了!呜呜呜!!!谢谢@Stacker-flow先生。
  • 先生先生!!!我对'sss'很好奇。 :D 's' 的数量取决于变量的数量?如果变量中只有一个整数,例如 $age,$name,$num 怎么办?所以它应该是'isi'它是正确的先生@Stacker-flow?
  • 是的,第一部分中“s”的数量必须与您正在使用的列匹配(并且按顺序排列)。例如,(name, age, favourite_color) 将有 ..("sis", $name, $age, $color);
猜你喜欢
  • 2011-05-18
  • 2021-08-16
  • 2015-05-03
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多