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

2015-01-24信息快讯网

在 Javascript 中,可以利用 escape/unescape() 和 eval_r() 函数进行简单的转码处理,让普通的 URL 网址看起来比较怪异,使那些令人讨厌的搜索爬虫无法辨认你希望隐藏的资源。

这里,一般都需要预先将正常的字符串编码成 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警告Cannot use a scalar value as an array的解决方法
Uncaught exception com_exception with message Failed to create COM object
php读取mysql乱码,用set names XXX解决的原理分享
shopex主机报错误请求解决方案(No such file or directory)
PHPExcel读取Excel文件的实现代码
PHP性能优化准备篇图解PEAR安装
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
PHP详解ASCII码对照表与字符转换
openPNE常用方法分享
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
php中$_REQUEST、$_POST、$_GET的区别和联系小结
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
php fsockopen中多线程问题的解决办法[翻译]
让Json更懂中文(JSON_UNESCAPED_UNICODE)
php XMLWriter类的简单示例代码(RSS输出)
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
PHP 数据结构 算法 三元组 Triplet
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
php下关于Cannot use a scalar value as an array的解决办法
PHP下escape解码函数的实现方法
PHP中的string类型使用说明
PHP STRING 陷阱原理说明
php set_magic_quotes_runtime() 函数过时解决方法
php下mysql数据库操作类(改自discuz)
用PHP为SHOPEX增加日志功能代码
php操作excel文件 基于phpexcel
PHP print类函数使用总结
PHP+ACCESS 文章管理程序代码
php $_SERVER["REQUEST_URI"]获取值的通用解决方法
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
javascript 小型动画组件与实现代码
Discuz!下Memcache缓存实现方法
php getimagesize 上传图片的长度和宽度检测代码
asp.net Repeater控件的说明及详细介绍及使用方法
php读取javascript设置的cookies的代码
DedeCMS 核心类TypeLink.class.php摘要笔记
©2014-2024 dbsqp.com