今日、サーバーに奇妙な問題が発生しました。GET 要求を正常に通過した mysql クエリの % および _ 記号から DDOS を取得しました。例えば
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の特殊文字をエスケープするのはどうですか?? 約 1 年前に、mysql クエリでパーセント記号を使用して引用符をエスケープする方法を読みました =) 当時はブラインド インジェクションの誇大広告でした。
ここで質問を述べなければなりません: Cakephp で変数をエスケープする方法 - 本当に安全ですか?
更新: IRC の一部の人々は、REQUEST 文字列をエスケープする必要があり、それ自体をクエリしないように述べています。彼らはおそらく正しいのですが、カスタム関数を使用せずに GET リクエスト文字列で % および _ chars をエスケープするにはどうすればよいですか?