我有一个要求,我必须使用用户通过表单提供的名称创建新的mysql数据库。目前,我只允许数据库名称使用alphanumeric
个字符。
我认为对数据库名称的这种alphanumeric
验证以某种方式保护我免受sql injection
,但我仍然想完全防止sql injection
。 我尝试在用户输入上使用mysql_real_escape_string
,但如果用户输入像这样new_db_name; DROP DATABASE other_database; --
,它就不会逃脱。
那么我怎样才能逃脱user input
,以便它可以安全地用于databse name
预防sql injection
呢?我正在使用 cakephp3 ,我已经尝试了以下代码cakephp3
它不会像new_db_name; DROP DATABASE other_database; --
那样转义用户输入
$db = mysql_real_escape_string($user_input);
$rootConnection = ConnectionManager::get('rootUserConnect');
//i)using query method
$rootConnection->query("CREATE DATABASE $db CHARACTER SET utf8 COLLATE utf8_general_ci");
//ii) or using execute method , it's throwing mysql syntax error
// $rootConnection->execute("CREATE DATABASE :db CHARACTER SET utf8 COLLATE utf8_general_ci",['db' => $db]);
提前谢谢。
在驱动程序中使用quoteIdentifier()
函数:
$rootConnection = ConnectionManager::get('rootUserConnect');
$db = $rootConnection->driver()->quoteIdentifier($db);
$root->connection->execute(...);
有关此方法的详细信息:http://api.cakephp.org/3.2/class-Cake.Database.Connection.html#_quoteIdentifier
使用查询生成器。你实际上忽略了ORM正在做的事情。使用ORM的原因之一是防止SQL注入。ORM将负责为您清理查询。
在某些情况下,开发人员仍然可能导致注入的可能性。手册还告诉您如何防止这种情况。