欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-19 18:56:07
这里,一般都需要预先将正常的字符串编码成 javascript unescape() 函数能够解译的格式,以 php 为例,可以使用以下函数实现 javascript 中...
这里,一般都需要预先将正常的字符串编码成 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 的浏览器下浏览页面,和没有启用这种保护机制情况下看到的呈现是完全相同的。