当您必须在CakePHP 3.4.7中手动转义SQL时

当您必须在CakePHP 3.4.7中手动转义SQL时,php,mysql,cakephp-3.0,Php,Mysql,Cakephp 3.0,因此,我想在CakePHP 3.4.7中执行以下SQL查询: DROP DATABASE $databasename 我发现这不起作用: $conn->execute("DROP DATABASE :databasename", ['databasename' => $databasename]); 。。。因为MySQL不接受数据库和表名作为准备语句中的参数(请参阅) 我不能使用CakePHP的Sanitize类,因为它在CakePHP 3()中已被弃用 我不能使用mysqli:

因此,我想在CakePHP 3.4.7中执行以下SQL查询:

DROP DATABASE $databasename
我发现这不起作用:

$conn->execute("DROP DATABASE :databasename", ['databasename' => $databasename]);
。。。因为MySQL不接受数据库和表名作为准备语句中的参数(请参阅)

我不能使用CakePHP的Sanitize类,因为它在CakePHP 3()中已被弃用

我不能使用mysqli::real\u escape\u字符串,因为这里没有mysqli对象


有人知道其他方法吗?

当你不能依靠别人的代码来实现安全性时,这是一个令人沮丧的问题,因为让我们面对现实,绝大多数人的安全性都不好。最好依赖那些库

<>但是,在你无法做到的情况下,比如说,你可以考虑一个小的白名单。想一想你期望看到什么,并加以实施。在我看来,我希望数据库名称只由字母和下划线组成。这显然不会覆盖所有可能的表名值(例如,数据库名也可以有数字),但重要的是您的情况

考虑到这一点,一个可能的清理例程可能是一个简单的正则表达式,强制要求传递的名称没有空格,以字母开头,之后可能有更多的字母或下划线,并且长度不能超过16个字符:

if ( ! preg_match('/^[A-z][A-z_]{0,15}$/', $databasename) ) {
    # database name does not pass the project standards of alpha
    # letters and underscores only.  Likely crack attempt.
    die('No way, Joker!');   # or something more appropriate.
}
这并不是DB驱动程序提供的完整性,但它简单易读,适用于超过90%的数据库名称。通过上述健全性检查后,您可以直接编写通常认为不安全的方法,该方法在本例中是安全的SQL字符串:

$conn->execute("DROP DATABASE $databasename");

转义将不起作用,因为这将用于引号,引号不用于表/列。您可以创建一个允许使用的术语的白名单,然后将其传递进来。我想在我的情况下,我应该只担心插入分号?但我也在考虑采用白名单的方式。我想你有一个可以删除的数据库列表。你不能检查一下这个词是否在这个列表中吗?有一个列表,但我也不相信。