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