关于浏览器对于html的input标签中name的命名特殊字符处理(GET)与script+js跨域实现
2013-03-29 12:19
681 查看
因为想使用script来跨域GET提交数据回调,为了尽量的少改动,想到使用php的ob_start();这样的方式来缓存输出到变量中再进行jscall,即可解决可控网站的跨域问题,
不用重复实现,且性能上比服务类代理好得多.
然后想到应该使用某些不常用的命名来使用传递必须的数据,如post变get时,使用某特殊命名来传递之类考虑,于是看了一下这个问题.
http://www.w3.org/TR/html401/types.html#type-cdata中的规范规定是如下:
ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods (".").
浏览器实测:
chrome
firefox
ie
op
看来标准中提到的写法还是都支持的.
实现的关键文件
jsCallBack.php
某js
以上二个文件配合下,就可以向discuz进行跨提交而无需再修改dx的返回方式,
script 的src大概是如下
http://bbs.qidizi.net/jsCallBack.php?f:=forum&mod=post&action=reply&comment=yes&page=1&commentsubmit=yes&infloat=yes&inajax=1&&p:formhash=d9546afe&p:handlekey=comment&p:message=dddddddddddddddddddddddddddddd&p:seccodeverify=dddddddddddddddddddddddddddddddddd&p:sechash=0&p:tid=720564&p:pid=3370691&c:=_gJson21364554034648
那么返回就是正常的js了
这样,只要在discuz目录下旋转一个jsCallBack.php文件
然后就可以在其它地方使用script方式伪ajax了.
不用重复实现,且性能上比服务类代理好得多.
然后想到应该使用某些不常用的命名来使用传递必须的数据,如post变get时,使用某特殊命名来传递之类考虑,于是看了一下这个问题.
http://www.w3.org/TR/html401/types.html#type-cdata中的规范规定是如下:
ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods (".").
浏览器实测:
chrome
firefox
ie
op
看来标准中提到的写法还是都支持的.
实现的关键文件
jsCallBack.php
<?php /* * 使用script标签的js回调的方式调用 * 因为需要js配合GET方式来使用,所以使用特殊的get时的命名,如post转get时 * name格式是[A-Za-z]开头,同时允许[0-9],"_","-",":" * f:=要运行php名字&c:=jsCallBack名字&p:其它字符=含有此前缀的变量都将转成POST变量,并删除get中的变量 * 在source\class\helper\helper_form.php中来源检查 */ header('Content-Type: text/html; charset=UTF-8'); define('DX_ROOT', str_replace("\\", '/', dirname(__FILE__)).'/'); $phps = array('forum', 'group', 'home', 'index', 'member', 'misc');//允许使用的php文件 if (empty($_GET['f:']) or !in_array($_GET['f:'], $phps)) exit('alert("xxx.php?f:=the_php_file_name or no allow");'); if (empty($_GET['c:'])) exit('alert("xxx.php?c:=js_call_back_func_handled");'); require_once (DX_ROOT."/chrd.func.php"); if (!myDomain()) exit('alert("don\'t allow");');//只允许同根域名提交,不允许外站提交 unset($_SERVER['HTTP_REFERER']);//已经校验过,如果给dx检验,只允许同子域,所以清空 $_SERVER['REQUEST_METHOD'] = 'POST';//防止不允许GET; foreach ($_GET as $key => & $val) { if (0 == (strncasecmp('p:', $key, 2))) {//处理post2get $_POST[substr($key, 2)] = $val;//注意传入时,会移除p: } } echo $_GET['c:'];//测试中发现无法此值放入create_function体内,总会自动变成null,而其它$_GET值却不会,奇怪,没细查 ob_start(create_function('$buf', 'return "(" .json_encode($buf). ");";')); require (DX_ROOT."{$_GET['f:']}.php"); ob_end_clean();
某js
_.gJson({//dx/source/function/function_core.php中的submitcheck方法,允许flash提交 url:forumUrl + 'jsCallBack.php?f:=forum&mod=post&action=reply&replysubmit=yes&infloat=yes&handlekey=fastpost&inajax=1' ,data:{//以下值需要post方式提交,所以,使用特殊方式 'p:formhash':_.dxFormHash //form的hash值 ,'p:message':_('answerMsg').value ,'p:seccodeverify':_('answerVerify').value //验证输入 ,'p:sechash':_.dxCodeHash //验证hash值 ,'p:subject':'' ,'p:fid' : _('answerFid').value , 'p:tid' : _('answerTid').value } ,fVar:'c:'//jscallback名字,gjson会自动生成一个全局的function句柄 ,func:function(data) { //jscallback 实现 data = data.match(/<script[^>]*>(.+?)<\/script>/); var hideWindow = function(){}; var showDialog = function(txt){_.showMaskDiv({htm:txt });}; var succeedhandle_fastpost = function (url, tip, obj) {//dx发送成功的接口 //('forum.php?mod=viewthread&tid=39&pid=121&page=1&extra=page%3D1#pid121', '非常感谢,回复发布成功,现在将转入主题页,请稍候……[ 点击这里转入主题列表 ]', {'fid':'2','tid':'39','pid':'121','from':'','sechash':'SU01yqk0'}); _.showMaskDiv({htm:'<a href="' +forumUrl+url+ '">'+ tip+'</a>', bind:{id:'answerSubmit'}}); var div = document.createElement('P'); div.innerHTML = _('answerMsg').value ; _('answerInsert').appendChild(div); _('answerReset').click(); } var errorhandle_comment = function (tip) {//dx发送失败的接口 _.showMaskDiv({htm:'发送失败<br/>' + tip}); } if (!data) return showDialog('提交完成'); try{eval(data[1]);}catch(e){showDialog('解析返回信息出错:<br/>' + (e.description ? e.description : e));} } });
以上二个文件配合下,就可以向discuz进行跨提交而无需再修改dx的返回方式,
script 的src大概是如下
http://bbs.qidizi.net/jsCallBack.php?f:=forum&mod=post&action=reply&comment=yes&page=1&commentsubmit=yes&infloat=yes&inajax=1&&p:formhash=d9546afe&p:handlekey=comment&p:message=dddddddddddddddddddddddddddddd&p:seccodeverify=dddddddddddddddddddddddddddddddddd&p:sechash=0&p:tid=720564&p:pid=3370691&c:=_gJson21364554034648
那么返回就是正常的js了
_gJson21364554034648("<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root><![CDATA[<script type=\"text
\/javascript\" reload=\"1\">if(typeof succeedhandle_comment=='function') {succeedhandle_comment('forum
.php?mod=viewthread&tid=720564&pid=3370691&page=1&extra=#pid3370691', '\u5e16\u5b50\u70b9\u8bc4\u6210
\u529f ', {'tid':'720564','pid':'3370691'});}<\/script>]]><\/root>");
这样,只要在discuz目录下旋转一个jsCallBack.php文件
然后就可以在其它地方使用script方式伪ajax了.
相关文章推荐
- 关于截取带html标签的文字的前n个字符的处理(需求一)
- 关于处理GET方式提交的含有特殊字符的参数jsp
- 关于截取带html标签的文字的前n个字符的处理(需求一)
- 关于处理GET方式提交的含有特殊字符的参数
- 关于处理GET方式提交的含有特殊字符的参数(转载)
- jsp中显示包含html标签等特殊字符的处理方式
- 关于截取带html标签的文字的前n个字符的处理(需求二)
- 关于浏览器在处理没有右尖括号闭合的标签和html注解
- js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符
- 关于处理GET方式提交的含有特殊字符的参数
- 如何让在Html中特殊字符被数据加载时对于html标签的自动转义 补充
- 关于处理GET方式提交的含有特殊字符的参数
- 关于request.getSession(false)和request.getSession(true)测试与Andriod模拟浏览器处理session机制的实现
- 关于处理GET方式提交的含有特殊字符的参数
- 关于处理GET方式提交的含有特殊字符的参数
- 关于php的 get_magic_quotes_gpc对于外部的处理
- html5基础学习日记0_HTML新建、图片、特殊字符代码、标签
- [Ruby] 关于字符串中特殊字符处理\n\t\r 的方法
- C# winform端 通过HttpWebRequest进行post和get请求,数据格式为json,后台java端接收,其中有关传输特殊字符(\t,\r,',\n,n)等处理
- php处理HTML表单控件命名中的特殊符号