当您绝对必须在 CakePHP 3.4.7 中手动转义 SQL 时
When you absolutely have to manually escape SQL in CakePHP 3.4.7
所以我想在 CakePHP 3.4.7 中执行以下 SQL 查询:
DROP DATABASE $databasename
我发现这不起作用:
$conn->execute("DROP DATABASE :databasename", ['databasename' => $databasename]);
... 因为 MySQL 不接受数据库和 table 名称作为准备语句中的参数(参见 Can PHP PDO Statements accept the table or column name as parameter? )
我无法使用 CakePHP 的 Sanitize class,因为它已在 CakePHP 3 ( https://book.cakephp.org/3.0/en/appendices/3-0-migration-guide.html#sanitize )
中弃用
我不能使用 mysqli::real_escape_string 因为据我所知没有 mysqli 对象...
有人知道其他选择吗?
当您不能依靠其他人的代码来确保安全时,这真是令人失望,因为让我们面对现实吧,绝大多数人都没有做好安全工作。最好依赖那些库!
但是,在您做不到的情况下,例如可能是这种情况,请考虑为您期望的内容设置一个小的可能性白名单。想想你期望看到什么,并执行它。在我看来,我希望数据库名称仅由 字母和下划线组成。这显然不会涵盖所有可能的 table 名称值(例如,数据库名称也可以有数字),但你的情况决定了重要的。
考虑到这一点,可能的清理例程可能是一个简单的正则表达式,它强制传递的名称没有空格,以字母开头,之后可能有更多字母或下划线,并且不能超过 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");
所以我想在 CakePHP 3.4.7 中执行以下 SQL 查询:
DROP DATABASE $databasename
我发现这不起作用:
$conn->execute("DROP DATABASE :databasename", ['databasename' => $databasename]);
... 因为 MySQL 不接受数据库和 table 名称作为准备语句中的参数(参见 Can PHP PDO Statements accept the table or column name as parameter? )
我无法使用 CakePHP 的 Sanitize class,因为它已在 CakePHP 3 ( https://book.cakephp.org/3.0/en/appendices/3-0-migration-guide.html#sanitize )
中弃用我不能使用 mysqli::real_escape_string 因为据我所知没有 mysqli 对象...
有人知道其他选择吗?
当您不能依靠其他人的代码来确保安全时,这真是令人失望,因为让我们面对现实吧,绝大多数人都没有做好安全工作。最好依赖那些库!
但是,在您做不到的情况下,例如可能是这种情况,请考虑为您期望的内容设置一个小的可能性白名单。想想你期望看到什么,并执行它。在我看来,我希望数据库名称仅由 字母和下划线组成。这显然不会涵盖所有可能的 table 名称值(例如,数据库名称也可以有数字),但你的情况决定了重要的。
考虑到这一点,可能的清理例程可能是一个简单的正则表达式,它强制传递的名称没有空格,以字母开头,之后可能有更多字母或下划线,并且不能超过 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");