所以我想在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对象......
有人知道其他选择吗?
答案 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");