Cookies CKEditor如何防止CSRF?

Cookies CKEditor如何防止CSRF?,cookies,ckeditor,csrf-protection,Cookies,Ckeditor,Csrf Protection,使用CKEditor 4.9.1时,您可能会注意到正在设置ckCsrfToken cookie。从中可以看出,这似乎在上载文件时用作CSRF保护 我找不到任何关于CKEditor如何防止CSRF攻击的文档。CKEditor是否正在实施该战略 我询问的原因是,我们的客户需要解释这个cookie的用途,而不仅仅是HTTP 任何指向参考文档或源代码的链接都将不胜感激:TL;DR:有证据表明,CKEditor允许任何第三方文件上传程序使用双提交Cookie策略保护自己免受CSRF攻击 现在来看完整的故事

使用CKEditor 4.9.1时,您可能会注意到正在设置ckCsrfToken cookie。从中可以看出,这似乎在上载文件时用作CSRF保护

我找不到任何关于CKEditor如何防止CSRF攻击的文档。CKEditor是否正在实施该战略

我询问的原因是,我们的客户需要解释这个cookie的用途,而不仅仅是HTTP

任何指向参考文档或源代码的链接都将不胜感激:

TL;DR:有证据表明,CKEditor允许任何第三方文件上传程序使用双提交Cookie策略保护自己免受CSRF攻击

现在来看完整的故事:查看源代码,似乎CKEditor并将其存储在cookie中,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;
}
然后,和插件在调用上载URL时都提交该令牌,如图所示:

以及:

CKEditor控件本身不附带文件上载程序。因此,将CKEditor集成到其产品中的开发人员有责任使用此令牌实现CSRF保护

-与CKEditor集成的付费文件上传器-使用CSRF令牌,并且似乎该令牌是为CKFinder添加的:

CKEditor用户注意:为了在启用CSRF保护的更新CKFinder的情况下直接在CKEditor内上载文件,CKEditor还应更新至2016年12月9日发布的最新稳定版本

最后,说明了CSRF保护是使用策略实现的,请参见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;
}
TL;DR:有证据表明,CKEditor允许任何第三方文件上传程序使用双提交Cookie策略保护自己免受CSRF攻击

现在来看完整的故事:查看源代码,似乎CKEditor并将其存储在cookie中,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;
}
然后,和插件在调用上载URL时都提交该令牌,如图所示:

以及:

CKEditor控件本身不附带文件上载程序。因此,将CKEditor集成到其产品中的开发人员有责任使用此令牌实现CSRF保护

-与CKEditor集成的付费文件上传器-使用CSRF令牌,并且似乎该令牌是为CKFinder添加的:

CKEditor用户注意:为了在启用CSRF保护的更新CKFinder的情况下直接在CKEditor内上载文件,CKEditor还应更新至2016年12月9日发布的最新稳定版本

最后,说明了CSRF保护是使用策略实现的,请参见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;
}

很好的研究Gyum Fox。作为CKEditor&CKFinder项目的一员,我确认你上面写的所有内容。很好的研究Gyum Fox。作为CKEditor&CKFinder项目的成员,我确认您在上面写的所有内容。