[原创]蚂蚁cms的ueditor上传图片窗口提示Uncaught SecurityError:Blocked a frame with origin错误解决方法

最近的蚂蚁CMS的二次开发项目中,出现个奇怪的问题,有些电脑的发布信息的UEditor的上传图片窗口能够正常显示按钮和上传按钮,但是有些电脑的浏览器发布信息的UEditor的上传图片窗口不显示,并提示

“Uncaught SecurityError:Blocked a frame with origin错误”

分析原因:

从问题看开始以为跨域访问的权限问题,设置了ie浏览器和firefox浏览器的安全跨域访问设置,还是没有解决问题,

然后是怀疑UEditor编辑器的问题,于是去了官网查找资料,发现现在的蚂蚁CMS版本低,用的UEditor版本也是低的,替换了新版本的UEditor编辑器,替换了还是不行,

于是开始设置断点,结果发现UEditor的internal.js的断点window.formElement为null,代码如下:


dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )];
//这里的windwo.frameElement为null

于是加入了为空的判断:


if(window.frameElement)
{
//alert(window.frameElement.id);
dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )];
}else{

dialog = parent.$EDITORUI[parent.document.activeElement.id.replace( /_iframe$/, '' )];
}

我的电脑浏览器经过firebug的断点可以获取到window.parent的内容,但是客户的window.parent确获取不到

什么问题?于是开始搜索“window.parent 获取不到”找到csdn上的一个帖子

http://bbs.csdn.net/topics/220072908

“iframe页面的js中需要访问window.parent.document,本地运行正常。上传至服务器后,发现window.parent.document不能访问,没有任何错误提示。求解 ”

得到帖子内容的回复的启发:

“这要看一下parent跟self是不是同一个域名下的 ”

JavaScript的dom对象有权限访问的控制,特别是parent和self,opener和self等跨框架的访问。你看下你的window.parent.document域名跟你的域名相同不?你可以显示的使用
<script>document.domain=”你的域名”;</script>来设置父子窗口的域名 ”

怀疑是不是出在iframe的src的url地址的域名问题,结果发现iframe的src直接引用的是如下地址:

“?mod=zhengwu&amp;file=zhengwu&amp;action=add”

这个链接从哪来的?没有域名?然而编辑器中的image上传图片的窗口也是用的iframe但是src却是带域名的完整url的,如下:

“http://www.yuanmax.com/ueditor/dialogs/image/image.html”

难道是这个图片上传窗口的iframe的域名和parent页面的域名不一致?

然后继续查看整个框架页面结构,整体页面结构如下:

看来iframe-wrap的src出了问题,src的地址是”?mod=zhengwu&amp;file=zhengwu&amp;action=add”

那么iframe-wrap的src地址从哪来的?点击左侧的“发布信息”在右侧的”iframe-wrap”显示,代码如下:

<a href=”?mod=zhengwu&amp;file=zhengwu&amp;action=add” target=”iframe-wrap”>发布信息</a>

好了,来源找到了,那么开始解决问题。

解决问题:

1.先找找后台管理的左侧菜单是怎么生成的?于是找到根目录下的后台管理文件:admin.php


if($mod!='index')
{
$modinfo=$moduleobj-&amp;amp;amp;amp;gt;get($mod,'folder');
$adminrole=explode(',',$modinfo['adminrole']);

if($action!='main' && (!$modinfo || (!in_array($_roleid,$adminrole) && !in_array($_userid,$admin_founders))))
{
exit('&amp;amp;amp;lt;script language="JavaScript"&amp;amp;amp;gt;{self.top.location.href="'.ADMIN_FILE.'";}&amp;amp;amp;lt;/script&amp;amp;amp;gt;');
}

$adminmenurole=string2array($modinfo['adminmenu']);
if($adminmenurole && isset($adminmenurole[$action]) && $action)
{
$adminmenurole=explode(',',$adminmenurole[$action]['role']);
if($action!='main' && (!in_array($_roleid,$adminmenurole) && !in_array($_userid,$admin_founders)))
{
exit('&amp;amp;amp;lt;script language="javascript"&amp;amp;amp;gt;{self.top.location.href="'.ADMIN_FILE.'";}&amp;amp;amp;lt;/script&amp;amp;amp;gt;');
}
}

if(in_array($action,array('type','type_add','role','config','grade')) &&$_SESSION['mysiteid'] &&$_sid)
{
exit('非法请求!IP:'.IP."已记录!");
}

if($modinfo['issystem'] &&!in_array($mod,array('member')))
{
include SYSTEM_ROOT.'admin/'.$file.'.inc.php';
}
else
{
include SYSTEM_ROOT.$modinfo['folder'].'/admin/load.inc.php';
}

调取

$modinfo=$moduleobj->get($mod,'folder');
中获取模型类文件根据模型id的值$mod的获取模型的信息,模型类文件路径:include\module.class.php


function get($id,$byfield='id')
{
return $this->db->fetch_one("SELECT * FROM `$this->table` WHERE `$this->table`.`$byfield`='".stripslashes($id)."'");
}

2.调取include SYSTEM_ROOT.$modinfo[‘folder’].’/admin/load.inc.php’;模型的加载文件,加载模板

3.模板调取include\module.class.php中的adminmenu()函数:


function usermodule()
{
return $this->db->fetch_all("SELECT * FROM `$this->table` WHERE `$this->table`.`issystem`=0 AND `$this->table`.`status`=1 ORDER BY `$this->table`.`orderby` ASC,`$this->table`.`id` DESC");
}

function adminmenu($moduleid)
{
global $_userid,$_roleid,$admin_founders,$_sid;
$menu='';
$modinfo=$this->get(intval($moduleid));
$r=string2array($modinfo['adminmenu']);
foreach($r as $key => $_r)
{
$adminrole=explode(',',$_r['role']);
if(!SITETYPE || ($key!='type' && $key!='type_add' && $key!='role' && $key!='config' && $key!='grade') || !$_sid)
{
if((in_array($_roleid,$adminrole) || in_array($_userid,$admin_founders)) && trim($_r['name']))
{
$menu.='


';
}
}
}

return $menu;
}

4.好了问题找到了,这里的连接加上$LA[‘siteurl’]的网站域名,修改了代码,加入了$LA的引用,解决:


function usermodule()
{
return $this->db->fetch_all("SELECT * FROM `$this->table` WHERE `$this->table`.`issystem`=0 AND `$this->table`.`status`=1 ORDER BY `$this->table`.`orderby` ASC,`$this->table`.`id` DESC");
}

function adminmenu($moduleid)
{
global $_userid,$LA,$_roleid,$admin_founders,$_sid;
$menu='';
$modinfo=$this->get(intval($moduleid));
$r=string2array($modinfo['adminmenu']);
foreach($r as $key => $_r)
{
$adminrole=explode(',',$_r['role']);
if(!SITETYPE || ($key!='type' && $key!='type_add' && $key!='role' && $key!='config' && $key!='grade') || !$_sid)
{
if((in_array($_roleid,$adminrole) || in_array($_userid,$admin_founders)) && trim($_r['name']))
{
$menu.='

';
}
}
}

return $menu;
}

分享到:更多 ()