Php 如何防止SQL注入?
我目前正在使用以下insert查询使用php更新mysql中的值:Php 如何防止SQL注入?,php,mysql,Php,Mysql,我目前正在使用以下insert查询使用php更新mysql中的值: $UpdateQuery = "UPDATE `mysqldb`.`cu_data` SET `app_status` = '".$_POST['Est']."', `nacionalidad` = '".$_POST['Nac']."', `ciudad_ini` =
$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”;}谢谢!这样的答案是我期待的。