Cookies CKEditor如何防止CSRF?
使用CKEditor 4.9.1时,您可能会注意到正在设置ckCsrfToken cookie。从中可以看出,这似乎在上载文件时用作CSRF保护 我找不到任何关于CKEditor如何防止CSRF攻击的文档。CKEditor是否正在实施该战略 我询问的原因是,我们的客户需要解释这个cookie的用途,而不仅仅是HTTP 任何指向参考文档或源代码的链接都将不胜感激:TL;DR:有证据表明,CKEditor允许任何第三方文件上传程序使用双提交Cookie策略保护自己免受CSRF攻击 现在来看完整的故事:查看源代码,似乎CKEditor并将其存储在cookie中,cookie不能仅为HTTP,因为它是在客户端设置的: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攻击 现在来看完整的故事
/**
* 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项目的成员,我确认您在上面写的所有内容。