0

今日、サーバーに奇妙な問題が発生しました。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 をエスケープするにはどうすればよいですか?

4

2 に答える 2

1

これは、Cake が SQL インジェクションの影響を受けやすいという意味ではありません。下層では準備済みステートメントを使用しているためLIKE、CakePHP で検索クエリを使用していて、ワイルドカード文字を許可していることを意味します。

私も開発中にこれを発見したので、これは理想的な動作ではないと思いますLIKE.

$term = str_replace('%', ' ', $term); 

自分でエスケープする必要はありません。フレームワークがそれを処理します。

于 2012-07-25T16:10:38.020 に答える
0

あなたが示すコード例は安全です。この行:

$data = "'" . mysqli_real_escape_string($this->connection, $data) . "'";

特殊文字をエスケープします。メソッドは変数の型をチェックします。文字列でない場合はエスケープする必要はありません。

mysql_real_escape_string(). _

于 2012-07-25T16:08:11.500 に答える