Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何防止SQL注入?_Php_Mysql - Fatal编程技术网

Php 如何防止SQL注入?

Php 如何防止SQL注入?,php,mysql,Php,Mysql,我目前正在使用以下insert查询使用php更新mysql中的值: $UpdateQuery = "UPDATE `mysqldb`.`cu_data` SET `app_status` = '".$_POST['Est']."', `nacionalidad` = '".$_POST['Nac']."', `ciudad_ini` =

我目前正在使用以下insert查询使用php更新mysql中的值:

    $UpdateQuery =  "UPDATE  `mysqldb`.`cu_data` SET            
                    `app_status` = '".$_POST['Est']."', 
                    `nacionalidad` = '".$_POST['Nac']."', 
                    `ciudad_ini` = '".$_POST['CiudadI']."', 
                    `ciudad_ent` = '".$_POST['CiudadE']."', 
                    `ciudad_dest` = '".$_POST['CiudadD']."', 
                    `ciudad_land` = '".$_POST['PEntrada']."', 
                    `uso_consr` = '".$_POST['U_Abog']."', 
                    `start` = '".$_POST['Envi']."', 
                    `t1` = '".$_POST['Cob']."', 
                    `t2` = '".$_POST['Acus']."', 
                    `t3` = '".$_POST['Invit']."', 
                    `t4` = '".$_POST['Entre']."', 
                    `t5` = '".$_POST['Recibo']."', 
                    `t6` = '".$_POST['EnvioF)']."', 
                    `t7` = '".$_POST['DatInternet']."', 
                    `t8` = '".$_POST['SoliMed']."', 
                    `t9` = '".$_POST['OrdeMe']."', 
                    `t10` = '".$_POST['SoliciPasa']."', 
                    `t11` = '".$_POST['EnvioPasas']."',
                    `t12` = '".$_POST['RecepPasa']."', 
                    `end` = '".$_POST['Landing']."', 
                    `Notas` = '".$_POST['Notas']."', 
                    `LastChange` = NOW()
                    WHERE  `cu_data`.`procid` = '".$_POST['Proceso']."' AND 
                            `cu_data`.`userid` = '$userid'
                    "; 
    $result = mysqli_query($con, $UpdateQuery);
代码正在运行,但现在我担心sql inyActions(不仅是坏的类型,还包括在任何表单字段中包含分号的用户)

我在考虑使用mysql\u real\u escape\u字符串进行某种形式的转义(正如对的第二个投票最多的答案中所建议的那样),但随后我在评论中看到了一些陷阱(我很难理解投票最多的那个)

有什么建议吗

提前谢谢

Ps:至少对于最后一个字段(nota),我需要用户输入任何符号,如($)%;:,。> 编辑:

我确实看过了建议的答案(很抱歉,我在原始问题中得到了一个糟糕的类似于另一个SO的答案)。因此,为了避免重复,我可以问一个关于如何对更新查询执行PDO操作的线索,就像我在上面展示的一样吗?(我的php来自mysql_uu天!)

编辑(2): 好的,这个问题被标记为重复,但我不同意所选答案(在这个问题之后显示的答案在这里已经有了答案:,因为这是我在问这个问题之前读到的答案。我确实在这里找到了另一个看起来更有趣(至少对我来说)的答案:(当然,一旦意识到PHP数据对象,也就是PDO,这一点就开始有意义了,而我没有意识到这一点。)

编辑(3): 我是这样做的:

     $UpdateQuery1 =  "UPDATE  `mysqldb`.`cu_data` SET            
                    `app_status` = ?, 
                    `nacionalidad` = ?, 
                    `ciudad_ini` = ?, 
                    `ciudad_ent` = ?, 
                    `ciudad_dest` = ?, 
                    `ciudad_land` = ?, 
                    `uso_consr` = ?, 
                    `start` = ?, 
                    `t1` = ?, 
                    `t2` = ?, 
                    `t3` = ?, 
                    `t4` = ?, 
                    `t5` = ?, 
                    `t6` = ?, 
                    `t7` = ?, 
                    `t8` = ?, 
                    `t9` = ?, 
                    `t10` = ?, 
                    `t11` = ?,
                    `t12` = ?, 
                    `end` = ?, 
                    `Notas` = ?, 
                    `LastChange` = NOW()
                     WHERE  `cu_data`.`procid` = ? AND 
                            `cu_data`.`userid` = ?";
                   $stmt = $con->prepare($UpdateQuery1);     
       $stmt->bind_param('ssssssssssssssssssssssss',      
$_POST['Estatus'],$_POST['Nacionalidad'],$_POST['CiudadI'],$_POST['CiudadE'],$_POST['CiudadD'],
$_POST['PEntrada'],$_POST['Uso_Abog'],$_POST['Envi'],$_POST['Cobro_de_Fee'],
$_POST['Acus'],$_POST['Invit'],$_POST['Entre'],$_POST['Recibo'],$_POST['EnvioF'],
$_POST['DatInternet'],$_POST['SoliMed'],$_POST['OrdeMe'],$_POST['SoliciPasa'],
$_POST['EnvioPasa'],$_POST['RecepPasa'],$_POST['Landing'],$_POST['Notas'],
$_POST['Proceso'],$userid);


       $stmt->execute();

作为奖励,my field Notas似乎能够保存任何文本,而不必转义特殊字符

,为获得针对注入攻击的最佳保护,请使用mysqli或PDO以及准备好的语句。Mysql_*函数已被弃用。有关mysqli的信息可在中找到

例如,具有已准备语句的查询如下所示:

$stmt = $mysqli->prepare('SELECT lastname FROM customers WHERE id = ?');
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt -> bind_result($lastName);
$stmt -> fetch();

$id保存要转义的字符串,$lastName变量保存从数据库返回的值。这将防止sql注入攻击。

如何执行此查询?第一条注释-不要使用
mysql\u*()
函数。它们已弃用,支持很快将被删除。第二条注释:切换到
mysqli
PDO
,并查看使用准备语句在将变量提交到query-1之前逐个检查变量,因为这是最容易找到重复变量的问题之一。(提示:写问题时,请查看建议的相关问题。如果使用正确的拼写,这会有所帮助。)嗨,迈克,我使用
$result=mysqli_query($con,$UpdateQuery);
通过“使用mysqli”你的意思不仅仅是使用mysqli_query()运行此查询?是的,无论何时在查询中使用用户输入,都要使用预先准备好的语句,而不是简单的mysqli\u查询。我将用一个例子更新我的答案。太好了,它对更新查询同样有效吗?我的意思是,我能做一些类似于
$stmt->bind\u param('s',$\u POST['Lastname']的事情吗;
我也可以使用多个
然后进行多个绑定吗?当然。多个参数在bind_param()的第一个参数中需要更多的字符。“s”代表字符串,“I”代表整数。因此,如果您得到两个字符串和一个数字,它看起来就像$stmt->bind_param('ssi',$POST['firstName'],$\u POST['lastName'],$\u POST['age']);要循环浏览几行,可以使用while($stmt->fetch()){echo“$lastName,$firstName”;}谢谢!这样的答案是我期待的。