【发布时间】:2012-07-25 15:54:41
【问题描述】:
今天我们的服务器出现了奇怪的问题。 我们已经从 % 和 _ 登录 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 没有过滤它们?在official mysql guide 他们写了很多关于这个问题的文章。这就是他们演示解决这个问题的方式:
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 请求字符串中的 % 和 _ 字符.. 任何清理方法都可以吗?
【问题讨论】:
-
%和_只是LIKE比较上下文中的特殊字符。因此,答案很简单:在将$str传递到数据库中用于LIKE比较之前,只需str_replace(array('%', '_'), array('\\%', '\_'), $str)。如果是例如插入或与任何其他比较运算符一起使用,无论如何它并不危险。这真的会导致问题吗?我原以为 MySQL 会将连续不止一个%的任何序列视为单个%- 尽管我可能错了。 -
是的,我们刚刚遇到了 DDOS,上面有那个 url,这就是为什么它非常重要。我亲自追踪了它
-
是的,但它实际上有什么影响?它是影响 MySQL 还是仅影响 Web 服务器进程? DDOS 攻击的最终坏结果是什么?
标签: php cakephp sql-injection