如何逃避mysql数据库名称以防止在cakephp3中注入sql?

时间:2016-03-08 08:00:02

标签: php mysql cakephp cakephp-3.0

我有一个要求,我必须使用用户通过表单提供的名称创建新的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}}

提前致谢。

2 个答案:

答案 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