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

时间:2017-10-20 14:41:48

标签: php mysql cakephp-3.0

所以我想在CakePHP 3.4.7中执行以下SQL查询:

DROP DATABASE $databasename

我发现这不起作用:

$conn->execute("DROP DATABASE :databasename", ['databasename' => $databasename]);

...因为MySQL不接受数据库和表名作为预准备语句中的参数(参见Can PHP PDO Statements accept the table or column name as parameter?

我不能使用CakePHP的Sanitize类,因为它已在CakePHP 3中被弃用(https://book.cakephp.org/3.0/en/appendices/3-0-migration-guide.html#sanitize

我不能使用mysqli :: real_escape_string因为AFAIK没有mysqli对象......

有人知道其他选择吗?

1 个答案:

答案 0 :(得分:1)

如果您不能依赖某人的其他代码来保护安全,那真是太糟糕了,因为让我们面对它,绝大多数人都没有做好安全保障。最好依靠这些库!

但是,如果你不能这样做,或许还有这种情况,可以考虑一下你想要的内容的小白名单。想想你期望看到的东西,并强制执行。在我看来,我希望数据库名称包含完全的字母和下划线。这显然不会涵盖所有可能的表名值(例如,数据库名称也可以包含数字),但是你的情况决定了什么是重要的。

考虑到这一点,一个可能的清理程序可能是一个简单的正则表达式,强制传递的名称没有空格,以字母开头,之后可能有更多的字母或下划线,并且不能超过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.
}

这不是数据库驱动程序提供的完整性,但它简单易读,并且适用于所有数据库名称的90%以上。通过上面的健全性检查,然后您可以直接编写通常被认为是不安全的方法 - 这种情况下安全的SQL字符串:

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