Как CKEditor защищает от CSRF?

При использовании CKEditor (4.9.1) вы можете заметить, что устанавливается файл cookie ckCsrfToken. Судя по примечаниям к выпуску, это используется в качестве защиты от CSRF при загрузке. файлы.

Я не смог найти никакой документации о том, как CKEditor защищает от CSRF-атак. Реализует ли CKEditor стратегию двойной отправки файлов cookie?

Причина, по которой я спрашиваю, заключается в том, что наш клиент хочет объяснить назначение этого файла cookie, а не только HTTP.

Будем признательны за любую ссылку на справочную документацию или исходный код :)


person Gyum Fox    schedule 27.03.2018    source источник


Ответы (1)


TL;DR: доказательства показывают, что CKEditor позволяет любому стороннему загрузчику файлов защищать себя от CSRF-атак с помощью стратегии Double Submit Cookie.

Теперь для полной истории: глядя на исходный код, кажется, что CKEditor генерирует токен CSRF по запросу и сохраняет его в файле cookie (который не может быть только HTTP, поскольку он устанавливается на стороне клиента):

/**
 * Returns the CSRF token value. The value is a hash stored in `document.cookie`
 * under the `ckCsrfToken` key. The CSRF token can be used to secure the communication
 * between the web browser and the server, i.e. for the file upload feature in the editor.
 *
 * @since 4.5.6
 * @returns {String}
 */
getCsrfToken: function() {
    var token = CKEDITOR.tools.getCookie( TOKEN_COOKIE_NAME );

    if ( !token || token.length != TOKEN_LENGTH ) {
        token = generateToken( TOKEN_LENGTH );
        CKEDITOR.tools.setCookie( TOKEN_COOKIE_NAME, token );
    }

    return token;
}

Затем используйте инструменты для работы с файлами и File Browser отправляют этот токен при вызове URL-адреса загрузки, как показано в обработчике fileUploadRequest:

// Append token preventing CSRF attacks.
$formData.append( 'ckCsrfToken', CKEDITOR.tools.getCsrfToken() );

и в методе appendToken:

tokenElement.setAttribute( 'value', CKEDITOR.tools.getCsrfToken() );

Сам элемент управления CKEditor не поставляется с «загрузчиком файлов». Поэтому разработчик, интегрирующий CKEditor в свой продукт, несет ответственность за использование этого токена для реализации защиты от CSRF.

CKFinder – платный "загрузчик файлов", который интегрируется с CKEditor — использует Токен CSRF и, просмотрев примечания к выпуску, кажется, что этот токен был добавлен для CKFinder:

Примечание для пользователей CKEditor: чтобы загружать файлы непосредственно в CKEditor с обновленным CKFinder (с включенной защитой CSRF), CKEditor также должен быть обновлен до последней стабильной версии (CKEditor 4.5.6 выпущен 9 декабря 2016 г.).

Наконец, исходный код CKFinder дает понять, что защита от CSRF реализована с использованием стратегия двойной отправки файлов cookie (см. DoubleSubmitCookieTokenValidator.php ):

/**
 * DoubleSubmitCookieTokenValidator constructor.
 *
 * @param string $tokenParamName
 * @param string $tokenCookieName
 * @param int    $minTokenLength
 */
public function __construct($tokenParamName = 'ckCsrfToken', $tokenCookieName = 'ckCsrfToken', $minTokenLength = 32)
{
    $this->tokenParamName = $tokenParamName;
    $this->tokenCookieName = $tokenCookieName;
    $this->minTokenLength = $minTokenLength;
}

/**
 * Checks if the request contains a valid CSRF token.
 *
 * @param Request $request
 *
 * @return bool `true` if the token is valid, `false` otherwise.
 */
public function validate(Request $request)
{
    $paramToken = trim((string) $request->get($this->tokenParamName));
    $cookieToken = trim((string) $request->cookies->get($this->tokenCookieName));

    if (strlen($paramToken) >= $this->minTokenLength && strlen($cookieToken) >= $this->minTokenLength) {
        return $paramToken === $cookieToken;
    }

    return false;
}
person Gyum Fox    schedule 27.03.2018
comment
Хорошее исследование Gyum Fox. Как участник проектов CKEditor и CKFinder, я подтверждаю все, что вы написали выше. - person Wiktor Walc; 30.07.2018