我有一个要求,我必须使用用户通过表单提供的名称创建新的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]);
{{1}}
提前致谢。
答案 0 :(得分:1)
Use the query builder.你有效地忽略了你正在做的事情的ORM。使用ORM的原因之一是阻止SQL注入。 ORM将负责为您清理查询。
在某些情况下,开发人员仍然可能导致注射的可能性。 The manual tells you as well how to prevent that
答案 1 :(得分:1)
您需要在驱动程序中使用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