我们的服务器上今天出现了一个奇怪的问题。 我们已经通过GET请求成功传递了mysql查询中的%和_的DDOS符号。例如cakephp转义函数或mysql_real_escape_string不安全?
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他们写了很多这个问题。这是他们展示如何解决这个:
在CakePHP的框架addcslashes(mysql_real_escape_string(“%something_”), “%_”);
有功能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;
}
只是一个基本的保护agains一些变量类型和这样的东西。关于MySQL的转义特殊字符什么??大约一年前,我阅读了如何在mysql查询的百分号帮助下逃避报价标志=)当时是盲目注入的大肆宣传,而且这个技巧几乎无处不在,因为每个人都使用mysqli_real_escape_string。
我必须在这里陈述一个问题:如何逃避cakephp中的变量 - 真的很安全吗?
更新: IRC中的一些人声明,REQUEST字符串必须转义并且不能自行查询。他们可能是正确的,那么我怎么能在GET请求字符串中转义%和_chars而不使用自定义函数..任何sanitize方法都可以做到这一点?
'%'和'_'只是'LIKE'比较中的特殊字符。因此答案很简单:在将'$ str'传递到数据库之前,只需要'str_replace(array('%','_'),array('\\%','\ _'),$ str)''用于“LIKE”比较。如果它是例如插入或与任何其他比较操作员一起使用,无论如何它都不是危险的。这究竟是否会造成问题?我原以为MySQL会将一行中多于一个'%'的任何序列视为一个'%' - 尽管我可能对此错误。 – DaveRandom 2012-07-25 16:16:43
是的,我们只是在顶部有了这个网址的DDOS,这就是为什么它非常重要。我亲自跟踪它 – holms 2012-07-25 16:33:48
是的,但它实际上有什么影响?它影响MySQL还是仅仅是Web服务器进程? DDOS攻击的最终坏结果是什么? – DaveRandom 2012-07-25 16:35:03