Php 如何在下面的代码中避免SQL注入?
我一直在思考如何避免对代码的SQL注入攻击 这就是我现在拥有的Php 如何在下面的代码中避免SQL注入?,php,mysql,mysqli,sql-injection,Php,Mysql,Mysqli,Sql Injection,我一直在思考如何避免对代码的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'];
<?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');
?>
如何对此进行改进?正如所建议的,准备好的语句是实现良好的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-整数
值?,?,?-这是bind_params语句的占位符,因此“?”将按顺序替换为您在bind_params方法中放置的值
你为什么不使用搜索工具自己查找信息?你使用MySQLi,你使用PHP,不难找到PHP-MySQLi-sql注入预防?,?,?。我需要在里面放点什么吗?变量,还是我需要这样键入有准备好的声明吗?是占位符,当执行命令时,它将采用元素i.esss、$email、$fn、$ln;并用bind_params方法中的变量按顺序替换“?”,因此不需要替换它。Ahhh。我得到了它。如果我有7个变量,那么我必须在里面打7个问号,对吗?现在我知道为什么了?让黑客不知道我今天已经学会了!芜湖!!!谢谢您,先生@Stacker-flow.sir!!!我对“sss”很好奇:D是“s”的数量取决于变量的数量?如果变量中只有一个整数,例如$age、$name、$num,那么它应该是'isi',对吗?@Stacker flow?是的,第一部分中的's'数量必须匹配,并且按照您使用的列的顺序排列。例如,名称、年龄、最喜欢的颜色将有..sis、$name、$age、$color;
$stmt->execute();
$_SESSION['notice'] = "Table updated";
}
else{
$_SESSION['notice'] = "Table could not be updated!";
}