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.php.cn/
이를 달성하기 위해 다음 스크립트를 사용할 수 있습니다.
코드는 다음과 같습니다.
<?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. ECMAScript v3 사양에서는 unescape() 사용이 더 이상 사용되지 않습니다. 사양에서는 새로운 대체 함수 decodeURIComponent() 사용을 권장하지만 테스트를 통해 decodeURIComponent() 함수가 다중을 지원하지 않는다는 것을 발견했습니다. -바이트 문자(중국어).) 처리 문제가 있어 unescape() 함수가 계속 사용됩니다.
3. 원칙적으로 위의 방법은 기밀로 유지되어야 한다고 생각되는 리소스 주소를 검색 크롤러가 얻는 것을 방지하기 위한 것입니다. Javascript를 지원하는 브라우저에서 페이지를 탐색할 때 이 보호 메커니즘 없이 표시되는 렌더링은 다음과 같습니다. 완전히 다릅니다.