0

我目前正在使用以下插入查询来使用 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 inyections(不仅是坏的类型,还有用户在任何表单字段中包含分号)

我正在考虑使用 mysql_real_escape_string 进行某种转义(正如该问题的第二个投票最多的答案中所建议的那样),但后来我在评论中看到了一些陷阱(而且我很难理解投票最多的一个)。

有小费吗?

提前致谢

Ps:至少对于最后一个字段(notas)我需要用户输入任何符号,例如 ($ # % ; : ,.>

编辑:

我确实看过建议的答案(抱歉,我不喜欢原始问题中的另一个 SO 答案)。因此,为了不重复,我能否要求提供有关如何对更新查询执行 PDO 操作的线索,就像我在上面显示的那样?(我的 php 来自 mysql_ 时代!)

已编辑(2):好的,所以这个问题已被标记为重复,但我不同意所选答案(显示在此问题之后的答案已在此处有答案:因为这是我在问此问题之前阅读的答案) . 我确实在这里找到了另一个看起来更有趣的(​​至少对我来说):用 PDO 和准备好的语句替换 mysql_* 函数(当然,一旦知道 PHP 数据对象,也就是我不是

编辑(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();

作为奖励,我的字段 Notas 似乎能够保存任何文本,而无需转义特殊字符

4

1 回答 1

2

为了最好地防止注入攻击,请使用 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 注入攻击。

于 2013-11-07T03:26:36.360 回答