私は次のように私のデータベースにログエントリを追加する機能を持っている:PHPのmysqli_real_escape_stringは()関数内で動作していない
function doLog($conn, $category, $result, $details){
$category = mysqli_real_escape_string($conn, $category);
$result = mysqli_real_escape_string($conn, $result);
$details = mysqli_real_escape_string($conn, $details);
mysqli_query($conn, "INSERT INTO log (category, result, details) VALUES('$category', '$result', '$details')");
return $details; //for debug
}
echo doLog2($conn, "Test", "Test", "A 'test' entry"); //echo is for debug
A 'テスト' エントリがA \ 'テストとしてエコー/返されます\ 'エントリが、スラッシュなしでデータベースに挿入されます。
これはどのようにすることができますか?
あなたのコードはSQLインジェクションに対して脆弱です。 [prepared statements](https://www.youtube.com/watch?v=nLinqtCfhKY)を使用する方法を学んでください。それは実際にあなたの問題を解決するはずです。 –
**警告**:mysqliを使用する場合は、[パラメータ化されたクエリ](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)と['bind_param']( http://php.net/manual/en/mysqli-stmt.bind-param.php)を使用してクエリにユーザーデータを追加します。 **重大な[SQLインジェクションのバグ](http://bobby-tables.com/)を作成するため、マニュアルエスケープと文字列補間または連結を使用しないでください。誤ってエスケープされていないデータは重大なリスクです。バインドされたパラメータを使用することはあまり冗長ではなく、適切に実行しているかどうかを確認するのが簡単です。 – tadman
面白い、私はちょうどあなたがこれを言った前に準備された声明文について読んでいた..ありがとう。これはここでは何の相互作用もありませんので、脆弱性はありませんが、ユーザーがdbとやりとりできるサイトの他の部分については間違いなく検討します。 –