[英]Prevent SQL injection in php from variable array
我正在尝试使代码从数组将数据插入MYSQL
我的问题是,它不受SQL注入的保护。
我在任何地方搜索,如何完全防止它。
我寻找这个问题
如何防止PHP中进行SQL注入?
但是我发现了两个答案,这让我再次思考。
https://stackoverflow.com/a/8255054/6523558
这里的每个答案仅涵盖部分问题。
实际上,有四个不同的查询部分,我们可以向其动态添加字符串,一个标识符和一个语法关键字的数字,而准备好的语句仅覆盖其中的两个
https://stackoverflow.com/a/60442/6523558
我四处寻找可以帮助我的东西,这是我发现的
http://www.w3schools.com/sql/sql_injection.asp
http://www.w3schools.com/sql/sql_datatypes_general.asp
但是没有什么能帮助我从代码中完全阻止它。
我正在使用此代码将数组数据插入MYSQL。
通过使用base64
防止这种情况。
$tbname = "some_table";
$array1 = array("one"=>"1a","two"=>"2b");
$S1["add1"] = " (";
$S1["add2"] = " VALUES (";
foreach($array1 as $k1=>$n1){
if($n1 !== ""){
$S1["add1"] .= $k1 . ", ";
$S1["add2"] .= "'" . base64_encode($n1) . "', ";
};}
$S1["add1"] = substr($S1["add1"],0,-2);
$S1["add1"] .= ")";
//if($S1["add1"] == ")"){$_SESSION["sql_msg"] = "You have to put at least one input";} else {
$S1["add2"] = substr($S1["add2"],0,-2);
$S1["add2"] .= ")";
$sql = "INSERT INTO " . $tbname . $S1["add1"] . $S1["add2"];
//if ($conn->query($sql) === TRUE) {$_SESSION["sql_msg"] = "New record created successfully";
//} else {$_SESSION["sql_msg"] = "Error: " . $sql . "<br>" . $conn->error;};}
//ref1();
echo $sql;
根据我的文章(更侧重于披露不良和错误的做法), SQL注入对准备好的语句没有帮助
防止SQL注入的保护实际上很简单,可以用以下两个语句来表述:
考虑到所有这些,您应该
为此,首先定义一个包含所有允许的字段名称的数组
$allowed = ["one","two"];
然后,需要从该数组中为INSERT查询创建一个SET语句,该语句应类似于
one = :one, two = two:
为此,您需要这样的代码
$allowed = ["one","two"];
$params = [];
$setStr = "";
foreach ($allowed as $key)
{
if (isset($array1[$key]))
{
$setStr .= "`".str_replace("`", "``", $key)."` = :".$key.",";
$params[$key] = $_POST[$key];
}
}
$setStr = rtrim($setStr, ",");
请注意,我们还将数据值放入不同的数组中
最后,从零件中获取查询(假定表名已在脚本中进行了硬编码),然后使用带有值的数组准备并执行查询
$tbname = "some_table";
$sql = "UPDATE `$tbname` SET $setStr";
$pdo->prepare($sql)->execute($params);
我猜最好的方法是使用
$sql = str_getcsv($sql,";")["0"];
在执行之前,以防止任何额外的命令
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.