我們的服務器上今天出現了一個奇怪的問題。 我們已經通過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