将TinyMCE图像上载与CakePHP 3.8集成时出现CSRF问题
我正在使用CakePHP3.8为网站创建CMS。我需要一个简单的所见即所得编辑器与图像上传。我以前使用过CKEditor,但是在上传图像时遇到了问题,所以我想我应该试试TinyMCE 因此,我下载了TinyMCE 5(带有所有标准插件),将其链接到页面的标题部分,并创建了一个带有TinyMCE文本区域的表单,如下所示:将TinyMCE图像上载与CakePHP 3.8集成时出现CSRF问题,cakephp,tinymce,cakephp-3.0,csrf,Cakephp,Tinymce,Cakephp 3.0,Csrf,我正在使用CakePHP3.8为网站创建CMS。我需要一个简单的所见即所得编辑器与图像上传。我以前使用过CKEditor,但是在上传图像时遇到了问题,所以我想我应该试试TinyMCE 因此,我下载了TinyMCE 5(带有所有标准插件),将其链接到页面的标题部分,并创建了一个带有TinyMCE文本区域的表单,如下所示: <fieldset> <legend>New Page</legend> <?php echo $thi
<fieldset>
<legend>New Page</legend>
<?php
echo $this->Flash->render();
echo $this->Form->create($newpage);
echo $this->Form->control('title');
echo $this->Form->control('content',
array('label' => 'Page Content',
'type' => 'textarea',
'id' => 'editor_area'));
echo $this->Form->button('Save');
echo $this->Form->end();
?>
</fieldset>
<script>
tinymce.init({
selector:'#editor_area',
height: 500,
menubar: false,
images_upload_url: '<?php echo IMG_UPLOAD_URL ?>',
toolbar: [
'undo redo | cut copy paste | styleselect | bold italic underline removeformat | alignleft aligncenter alignright | charmap | bullist numlist | link image'
],
plugins: ['advlist lists link autolink image charmap imagetools code']
});
</script>
上载图像时,控制台中出现以下错误:
Failed to load resource: the server responded with a status of 403 (Forbidden)
CakePHP的输出显示错误:
Error: CSRF token mismatch.
调试器显示POST包含以下内容:
Cookie: CAKEPHP=dvsktjv7vp8la5nv7dv19634d1; csrfToken=53e5718e13a1e963d51f9c93c48471a478b35c02b565d6f0699cd2a335775c2b17986cfc2cc587ff7343a6573e3eb2e498a9cb962397599c023417d1dfa9506c; ckCsrfToken=7l2PEC0g06819qQcLwdX5ul7E7jNRa3r61jENt2x
我不知道接下来该怎么办
(或者,如果有一种更直接的方法,包括一个免费/便宜的WYSIWYG编辑器和一个像样的图像/文件上传器,我愿意接受建议!这是一个学校的网站,所以预算很小,不可能是每月的费用。)cookie数据只是CSRF保护机制的一部分,客户端需要在请求数据或
X-CSRF-token
头中发送CSRF令牌
我对TinyMCE图像上传不太熟悉,但是看看文档,您可能需要一个定制的上传处理程序,您可以在其中添加额外的数据,即CSRF令牌
例如,处理程序可能看起来像这样,其中CSRF令牌被附加到表单数据中:
images\u upload\u处理程序:函数(blobInfo,成功,失败){
var-xhr,formData;
xhr=newXMLHttpRequest();
xhr.withCredentials=false;
xhr.open('POST',);
xhr.onload=函数(){
var-json;
如果(xhr.status!=200){
失败('HTTP错误:'+xhr.status);
返回;
}
json=json.parse(xhr.responseText);
如果(!json | | typeof json.location!=“string”){
失败(“无效的JSON:”+xhr.responseText);
返回;
}
成功(json.location);
};
formData=新的formData();
append('file',blobInfo.blob(),blobInfo.filename());
//在表单数据中追加CSRF令牌
formData.append(“'u csrfToken'”);
xhr.send(formData);
}
另外,根据文档,响应JSON必须包含一个名为location
的属性,该属性包含上传文件的web路径,该路径可能位于您遗漏的代码中,以防万一
另见
X-CSRF-token
头中发送CSRF令牌
我对TinyMCE图像上传不太熟悉,但是看看文档,您可能需要一个定制的上传处理程序,您可以在其中添加额外的数据,即CSRF令牌
例如,处理程序可能看起来像这样,其中CSRF令牌被附加到表单数据中:
images\u upload\u处理程序:函数(blobInfo,成功,失败){
var-xhr,formData;
xhr=newXMLHttpRequest();
xhr.withCredentials=false;
xhr.open('POST',);
xhr.onload=函数(){
var-json;
如果(xhr.status!=200){
失败('HTTP错误:'+xhr.status);
返回;
}
json=json.parse(xhr.responseText);
如果(!json | | typeof json.location!=“string”){
失败(“无效的JSON:”+xhr.responseText);
返回;
}
成功(json.location);
};
formData=新的formData();
append('file',blobInfo.blob(),blobInfo.filename());
//在表单数据中追加CSRF令牌
formData.append(“'u csrfToken'”);
xhr.send(formData);
}
另外,根据文档,响应JSON必须包含一个名为location
的属性,该属性包含上传文件的web路径,该路径可能位于您遗漏的代码中,以防万一
另见
Cookie: CAKEPHP=dvsktjv7vp8la5nv7dv19634d1; csrfToken=53e5718e13a1e963d51f9c93c48471a478b35c02b565d6f0699cd2a335775c2b17986cfc2cc587ff7343a6573e3eb2e498a9cb962397599c023417d1dfa9506c; ckCsrfToken=7l2PEC0g06819qQcLwdX5ul7E7jNRa3r61jENt2x