繁体   English   中英

防止PHP从变量数组中注入SQL

[英]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注入的保护实际上很简单,可以用以下两个语句来表述:

  • 为每个数据值使用占位符
  • 将其他所有内容列入白名单

考虑到所有这些,您应该

  1. 将您的表和字段名称列入白名单
  2. 创建一个包含占位符并过滤出表和字段名称的查询
  3. 发送您的变量数组到执行。

为此,首先定义一个包含所有允许的字段名称的数组

$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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM