今天我们的服务器上出现了奇怪的问题。 我们在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请求字符串中转义%和_ chars ..任何sanitize方法都可以吗?
答案 0 :(得分:1)
这并不意味着Cake容易受到SQL注入的影响,因为它在下层使用预准备语句,它确实意味着你在CakePHP中使用LIKE
搜索查询,但它允许使用通配符。 / p>
我不认为这是理想行为,因为我在开发过程中也发现了这一点,我上面的这一行发现现在使用LIKE
。
$term = str_replace('%', ' ', $term);
您不需要自己动手,框架会为您处理。
答案 1 :(得分:0)
您展示的代码示例是安全的。这一行:
$data = "'" . mysqli_real_escape_string($this->connection, $data) . "'";
转义特殊字符。该方法检查变量的类型 - 如果它不是字符串,则不需要进行转义。
很高兴看到mysql_real_escape_string()
涉嫌“漏洞”的来源。