今天在我们的服务器上出现了奇怪的问题。我们已经从 % 和 _ 登录 mysql 查询中获得了 DDOS,它们已成功通过 GET 请求。例如
domain.com/search/%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25v%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25a
似乎 cakephp 没有过滤它们?在官方 mysql 指南中,他们写了很多关于这个问题的文章。这就是他们展示解决这个问题的方式:
addcslashes(mysql_real_escape_string(“%something_”), “%_”);
在 cakephp 框架中有escape()
在模型中随处使用的函数。看看它包含什么:
/**
* Returns a quoted and escaped string of $data for use in an SQL statement.
*
* @param string $data String to be prepared for use in an SQL statement
* @param string $column The column into which this data will be inserted
* @param boolean $safe Whether or not numeric data should be handled automagically if no column data is provided
* @return string Quoted and escaped data
*/
function value($data, $column = null, $safe = false) {
$parent = parent::value($data, $column, $safe);
if ($parent != null) {
return $parent;
}
if ($data === null || (is_array($data) && empty($data))) {
return 'NULL';
}
if ($data === '' && $column !== 'integer' && $column !== 'float' && $column !== 'boolean') {
return "''";
}
if (empty($column)) {
$column = $this->introspectType($data);
}
switch ($column) {
case 'boolean':
return $this->boolean((bool)$data);
break;
case 'integer' :
case 'float' :
case null :
if ($data === '') {
return 'NULL';
}
if (is_float($data)) {
return str_replace(',', '.', strval($data));
}
if ((is_int($data) || is_float($data) || $data === '0') || (
is_numeric($data) && strpos($data, ',') === false &&
$data[0] != '0' && strpos($data, 'e') === false)) {
return $data;
}
default:
$data = "'" . mysqli_real_escape_string($this->connection, $data) . "'";
break;
}
return $data;
}
只是对一些变量类型和类似这样的东西的基本保护.. 转义 mysql 特殊字符怎么样?大约一年前,我读到了如何在 mysql 查询中借助百分号来转义引号 =) 当时是盲目注入的炒作,而且这个技巧几乎无处不在,因为每个人都使用 mysqli_real_escape_string。
我必须在这里提出一个问题:如何在 cakephp 中转义变量 - 真的安全吗?
更新: IRC 中的一些人指出,必须对 REQUEST 字符串进行转义,而不是自行查询。他们可能是对的,那么我如何在不使用自定义函数的情况下在 GET 请求字符串中转义 % 和 _ 字符.. 任何清理方法都可以吗?