mysql_real_escape_string() には修正不可能な欠陥がありますか?
一部の懐疑論者は、mysql_real_escape_string() 関数には根本的な欠陥があり、SQL クエリを確実に保護できないと主張しています。 。彼らは証拠として古い記事を指摘しています。
カスタムのプリペアド ステートメントに使用できますか?
これらの懸念にもかかわらず、mysql_real_escape_string() を利用して作成することは可能です。カスタムの準備されたステートメント。ただし、文字セットの処理には細心の注意が必要です。
解決策:
mysql_real_escape_string() の MySQL C API ドキュメントによると、mysql_set_character_set() を使用して設定する必要があります。文字セット。これにより、mysql_real_escape_string() で使用される文字セットにも確実に影響します。
コード例:
#include <mysql.h> int main() { MYSQL *conn = mysql_init(NULL); mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0); // Change the encoding using mysql_set_charset() mysql_set_charset(conn, "utf8"); // Create a custom prepared statement using mysql_real_escape_string() char query[1024]; mysql_real_escape_string(conn, query, "SELECT * FROM users WHERE username='test'", sizeof(query)); // Execute the query mysql_query(conn, query); mysql_close(conn); return 0; }
このアプローチに従って、SET NAMES/SET CHARACTER SET を回避します。を使用すると、mysql_real_escape_string() を効果的に利用して、SQL クエリをインジェクションから保護できます。
以上がmysql_real_escape_string() はカスタムプリペアドステートメントで安全に使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。