在PHP中实现Javascript的escape()函数代码


Posted in PHP onAugust 08, 2010

这里,一般都需要预先将正常的字符串编码成 JavaScript unescape() 函数能够解译的格式,以 PHP 为例,可以使用以下函数实现 Javascript 中 escape() 函数相同的功能:

<?php 
function escapeToHex($string, $encoding = UTF-8) { 
$return = ; 
for ($x = 0; $x < mb_strlen($string, $encoding); $x ++) { 
$str = mb_substr($string, $x, 1, $encoding); 
if (strlen($str) > 1) { // 多字节字符 
$return .= %u . strtoupper(bin2hex(mb_convert_encoding($str, UCS-2, $encoding))); 
} else { 
$return .= % . strtoupper(bin2hex($str)); 
} 
} 
return $return; 
} 
?>

假设我们要隐藏以下地址:http://www.dirk.sh/assets/uploaded/thisistest.pdf
我们可以利用以下脚本实现:
<?php 
// 请自行包含 escapeToHex() 函数定义 
$test = document.write(\<a href="http://www.dirk.sh/assets/uploaded/thisistest.pdf">test</a>\); 
echo <script Language="Javascript">eval_r(unescape(" . escapeToHex($test) . "))</script>; 
?>

如果你查看页面源代码,你会看到(因为太长,所以进行了手动分行,实际运行结果应该是完整的一行):
<script Language="Javascript">eval_r(unescape("%64%6F%63%75%6D%65%6E%74%2E%77 \ 
%72%69%74%65%28%27%3C%61%20%68%72%65%66%3D%22%68%74%74%70%3A%2F%2F%77%77%77 \ 
%2E%64%69%72%6B%79%65%2E%6E%65%74%2F%75%70%6C%6F%61%64%65%64%2F%74%68%69%73 \ 
%69%73%74%65%73%74%2E%70%64%66%22%3E%74%65%73%74%3C%2F%61%3E%27%29"))</script>

而在浏览器中显示的页面,和普通 html 没有分别。
注:
1、escapeToHex() 函数的第二个参数($encoding)表示你传递进来的字符串的编码,默认是 UTF-8,如果你使用了其他编码,应该在调用函数的明确指定;
2、unescape() 在 ECMAScript v3 规范中被反对使用,该规范建议使用新的替代函数 decodeURIComponent(),但我经过测试发现,decodeURIComponent()函数对多字节字符(中文)处理存在问题,所以仍然使用了 unescape() 函数。
3、原则上来说,上述方法只是为了防止搜索爬虫获取你认为需要保密的资源地址,在支持 Javascript 的浏览器下浏览页面,和没有启用这种保护机制情况下看到的呈现是完全相同的。
PHP 相关文章推荐
一个分页的论坛
Oct 09 PHP
php md5下16位和32位的实现代码
Apr 09 PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
Nov 07 PHP
第七章 php自定义函数实现代码
Dec 30 PHP
解析php中memcache的应用
Jun 18 PHP
web server使用php生成web页面的三种方法总结
Oct 28 PHP
php中实现xml与mysql数据相互转换的方法
Dec 25 PHP
PHP用反撇号执行外部命令
Apr 14 PHP
详解PHP编码转换函数应用技巧
Oct 22 PHP
php无限级分类实现评论及回复功能
Feb 18 PHP
PHP Trait代码复用类与多继承实现方法详解
Jun 17 PHP
PHP实现的AES 128位加密算法示例
Sep 16 PHP
PHP下escape解码函数的实现方法
Aug 08 #PHP
ubuntu 编译安装php 5.3.3+memcache的方法
Aug 05 #PHP
PHP MemCached高级缓存配置图文教程
Aug 05 #PHP
PHP Array交叉表实现代码
Aug 05 #PHP
php垃圾代码优化操作代码
Aug 05 #PHP
PHP MemCached 高级缓存应用代码
Aug 05 #PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
Aug 01 #PHP
You might like
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
在Debian系统下配置LNMP的教程
2015/07/09 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
jQuery ui1.7 dialog只能弹出一次问题
2009/08/27 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
node.js中的path.sep方法使用说明
2014/12/08 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
2016/01/28 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
js学使用setTimeout实现轮循动画
2017/07/17 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
js如何验证密码强度
2020/03/18 Javascript
JavaScript eval()函数定义及使用方法详解
2020/07/07 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
[05:49]2014DOTA2TI4正赛第二日综述 昔日冠军纷纷落马 VG LGD占尽先机
2014/07/20 DOTA
python实现封装得到virustotal扫描结果
2014/10/05 Python
使用Python编写一个简单的tic-tac-toe游戏的教程
2015/04/16 Python
python绘制多个子图的实例
2019/07/07 Python
python的移位操作实现详解
2019/08/21 Python
详解django中Template语言
2020/02/22 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
django 模型中的计算字段实例
2020/05/19 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
linux面试题参考答案(11)
2012/05/01 面试题
网络工程师的自我评价
2013/10/02 职场文书
医院护士专业个人的求职信
2013/12/09 职场文书
领导班子作风建设剖析材料
2014/10/11 职场文书
社区灵活就业证明
2014/11/03 职场文书
2015年国庆节演讲稿范文
2015/07/30 职场文书
2016教师廉洁从教心得体会
2016/01/13 职场文书
安全生产培训心得体会
2016/01/18 职场文书