Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在cakephp3中转义mysql数据库名称以防止sql注入?_Php_Mysql_Cakephp_Cakephp 3.0 - Fatal编程技术网

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

如何在cakephp3中转义mysql数据库名称以防止sql注入?,php,mysql,cakephp,cakephp-3.0,Php,Mysql,Cakephp,Cakephp 3.0,我有一个要求,我必须用用户通过表单提供的名称创建新的mysql数据库。目前,我只允许数据库名称使用字母数字字符 我认为,对数据库名称进行的字母数字验证在某种程度上保护了我免受sql注入的影响,但我仍然想彻底阻止sql注入。我曾尝试在用户输入上使用mysql\u real\u escape\u string,但如果用户输入是这样的new\u db\u name,则不会转义;删除其他_数据库-- 那么,我如何才能转义用户输入,以便它可以安全地用于数据库名称防止sql注入?我正在使用cakephp3,

我有一个要求,我必须用用户通过表单提供的名称创建新的mysql数据库。目前,我只允许数据库名称使用
字母数字
字符

我认为,对数据库名称进行的
字母数字
验证在某种程度上保护了我免受
sql注入
的影响,但我仍然想彻底阻止
sql注入
。我曾尝试在用户输入上使用
mysql\u real\u escape\u string
,但如果用户输入是这样的
new\u db\u name,则不会转义;删除其他_数据库--

那么,我如何才能转义
用户输入
,以便它可以安全地用于
数据库名称
防止
sql注入
?我正在使用cakephp3,我尝试了
cakephp3
中的以下代码,它不会像
new\u db\u name那样逃避用户输入;删除其他_数据库--

提前感谢。

您在做的事情实际上忽略了ORM。使用ORM的原因之一是为了防止SQL注入。ORM将为您清理查询

在一些情况下,显影剂仍然可能导致注入

你所做的实际上忽略了ORM。使用ORM的原因之一是为了防止SQL注入。ORM将为您清理查询


在一些情况下,显影剂仍然可能导致注入

您需要在驱动程序中使用
quoteIdentifier()
函数:

$rootConnection = ConnectionManager::get('rootUserConnect');
$db = $rootConnection->driver()->quoteIdentifier($db);
$root->connection->execute(...);

有关此方法的详细信息:

您需要在驱动程序中使用
quoteIdentifier()
函数:

$rootConnection = ConnectionManager::get('rootUserConnect');
$db = $rootConnection->driver()->quoteIdentifier($db);
$root->connection->execute(...);

有关此方法的更多信息:

使用Cake的ORM:使用Cake的ORM:简单地说,让用户创建数据库名称并不是一个好主意。最好指定一个受控名称,例如唯一id,并将用户想要的名称与实际使用的名称之间的关系保存在另一个数据库中assigned@lorenzo
quoteIdentifier()
是否仅用反勾号包围字符串?我现在无法测试它,但我认为SQL注入仍然是可能的,比如
new_db_name`;删除其他_数据库--。IIRC PDO不支持对标识符进行转义/清除,因此必须手动执行,比如按照您的建议使用白名单,或者如果用户确实需要能够选择名称,则使用非常严格的正则表达式,例如只允许ASCII字母。@ndm是的,这就是为什么我建议不让用户选择我看到的db名称,我之所以提出这个问题,是因为人们很可能会认为你说的是,这实际上阻止了SQL注入,因为这正是问题所要求的。简单地说,让用户创建数据库名称并不是一个好主意。最好指定一个受控名称,例如唯一id,并将用户想要的名称与实际使用的名称之间的关系保存在另一个数据库中assigned@lorenzo
quoteIdentifier()
是否仅用反勾号包围字符串?我现在无法测试它,但我认为SQL注入仍然是可能的,比如
new_db_name`;删除其他_数据库--。IIRC PDO不支持对标识符进行转义/清除,因此必须手动执行,比如按照您的建议使用白名单,或者如果用户确实需要能够选择名称,则使用非常严格的正则表达式,例如只允许ASCII字母。@ndm是的,这就是为什么我建议不让用户选择我看到的db名称,我之所以提出这个问题,是因为人们很可能会认为你说的是,这实际上阻止了SQL注入,因为这就是问题所要求的。