2017-06-07 16 views
-1

私は次のように私のデータベースにログエントリを追加する機能を持っている: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 \ 'テストとしてエコー/返されます\ 'エントリが、スラッシュなしでデータベースに挿入されます。

これはどのようにすることができますか?

+1

あなたのコードはSQLインジェクションに対して脆弱です。 [prepared statements](https://www.youtube.com/watch?v=nLinqtCfhKY)を使用する方法を学んでください。それは実際にあなたの問題を解決するはずです。 –

+0

**警告**: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

+0

面白い、私はちょうどあなたがこれを言った前に準備された声明文について読んでいた..ありがとう。これはここでは何の相互作用もありませんので、脆弱性はありませんが、ユーザーがdbとやりとりできるサイトの他の部分については間違いなく検討します。 –

答えて

2

これは正しく動作しています。バックスラッシュは、SQLクエリの引用符をエスケープして、引用符がそのまま挿入されるようにします。 またには、エスケープ文字\を挿入しないでください。あなたが二回エスケープを適用した場合

、あなたがこのようなエスケープ引用符が続くエスケープバックスラッシュで終わるだろう:データベースに格納される何

A \\\'test\\\' entry 

は次のようになります。

A \'test\' entry 

パラメータ化された文を使用すると、これははるかに簡単です。引用やエスケープはしないでください。

function doLog($conn, $category, $result, $details){ 
    $sql = "INSERT INTO log (category, result, details) VALUES (?, ?, ?)"; 
    $stmt = mysqli_prepare($conn, $sql); 
    mysqli_stmt_bind_param($stmt, "sss", $category, $result, $details); 
    mysqli_stmt_execute($stmt); 

    return $details; //for debug 
} 
+0

うーん..多分私は何か違ったことをしているのだろうか?私は過去に常に同じコードを使用してきましたが、常にデータベース内の文字をエスケープしています。しかし、それに関係なく、もしそれが\ 'データベースとしても\'ではないはずですか? –

+0

@ ShaneTクエリでエスケープされる方法は、データベースに格納される方法とは2つの異なるものです。これは、ソースの '&'がHTMLの '&'とどのように同じであるか、文字列自体に二重引用符があるときに '\" 'がどのように現れるかを示します。 – tadman

関連する問題