在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初学者们头痛的十四个问题
Jan 15 PHP
PHP 服务器配置(使用Apache及IIS两种方法)
Jun 01 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
Jun 17 PHP
通过php快速统计某个数据库中每张表的数据量
Sep 04 PHP
PHP不用第三变量交换2个变量的值的解决方法
Jun 02 PHP
PHP使用redis实现统计缓存mysql压力的方法
Nov 14 PHP
9个比较实用的php代码片段
Mar 15 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
Sep 22 PHP
使用WAMP搭建PHP本地开发环境
May 10 PHP
Laravel推荐使用的十个辅助函数
May 10 PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 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
Apache2 httpd.conf 中文版
2006/11/17 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
用正则获取指定路径文件的名称
2007/02/27 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
javascript中的五种基本数据类型
2015/08/26 Javascript
基于jQuery实现音乐播放试听列表
2016/04/14 Javascript
js原生跨域_用script标签的简单实现
2016/09/24 Javascript
node.js版本管理工具n无效的原理和解决方法
2016/11/24 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
2017/01/16 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
Vue生命周期示例详解
2017/04/12 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
nodejs基础之buffer缓冲区用法分析
2018/12/26 NodeJs
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
Django框架视图函数设计示例
2019/07/29 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
如何在Python3中使用telnetlib模块连接网络设备
2020/09/21 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
加拿大票务网站:Ticketmaster加拿大
2017/07/17 全球购物
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
社区维稳工作方案
2014/06/06 职场文书
试用期自我评价怎么写
2015/03/10 职场文书
2015年仓库管理工作总结
2015/05/25 职场文书
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript