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 インジェクションが心配です (悪い種類だけでなく、フォーム フィールドのいずれかにセミコロンを含むユーザーのようなものも)

私は mysql_real_escape_string を使用してある種のエスケープを使用することを考えていました (この質問に対する 2 番目の最も投票された回答で示唆されているように)、コメントにいくつかの落とし穴があります (そして、最も投票されたものを理解するのに苦労しています)。

任意のヒント?

前もって感謝します

Ps: 少なくとも最後のフィールド (notas) については、ユーザーが ($ # % ; : ,.> などの記号を入力する必要があります)

編集:

提案された回答を見ました(元の質問の別のSO回答に悪いようでした)。重複しないように、上記のような更新クエリに対して PDO を実行する方法についての手がかりを求めてもよろしいですか? (私の php は mysql_ の時代のものです!)

編集済み (2): この質問には重複のフラグが付けられていますが、選択した回答には同意しません (この質問の後に表示される回答には既に回答があります:この質問をする前に読んだものです) 。ここで、(少なくとも私にとっては) もっと興味深い別のものを見つけました: mysql_* 関数を PDO と準備済みステートメントで置き換える(もちろん、これは、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();

おまけとして、私のフィールド 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 に答える