<div class="linkL">STRAŠNI MIKROSKOP</div>
<?php
$chapter = "chapters/" . $_GET["ch"] . ".php";
include $chapter;
?>
JS
$(".linkL").click(function() {
var a = $(this).html();
var b = a.split(' ').join('-');
var c = b.toLowerCase();
location.href = "index.php?ch=" + c;
});
点击地址栏后我有index.php?ch=strašni-mikroskop
。没关系,但文件chapters/strašni-mikroskop
不包括在内!?
如果我将š
替换为s
- 一切正常。
那么,如何使用š
unicode字符来使用上述代码?
所有文件都编码为utf8。
答案 0 :(得分:0)
location.href = "index.php?ch=" + c;
您需要encodeURIComponent(c)
。否则,网址中特殊的任何字符(例如%
或&
)都会破坏该网址。这也确保了URL中使用的编码是UTF-8;如果没有显式编码,则由浏览器决定会发生什么,并且您可能会得到不一致的结果。
$chapter = "chapters/" . $_GET["ch"] . ".php";
include $chapter;
问题1:文件名的编码需要与URL中的编码相同。这意味着您需要配置文件传输工具以使用UTF-8(如何执行此操作取决于工具)。如果您的服务器是Windows,则无法使用UTF-8,因此您必须故意错误编码文件名。 (例如,对于西欧服务器,它将使用代码页1252,在这种情况下,您将不得不拼写错误拼写您的文件straÅ¡ni-mikroskop.php
。)
这可能不值得尝试这样做,因为它很脆弱,当你转移到不同的工具和服务器时会破坏。
问题2:这是安全漏洞。攻击者可以提供../someotherdirectory/x
之类的任意相对路径名来执行您不期望的文件。这可能与文件上传等其他功能相结合,使攻击者能够在您的服务器上执行任意代码。或者可以只包括index.php
本身以获得无限循环并DoS您的服务器。
使用安全编码方案可以避免这两个问题。例如,使用bin2hex(c)
,您可以调用可在任何地方使用的文件73747261c5a16e692d6d696b726f736b6f70.php
,并避免使用/
等路径特殊字符。
但通常最好不允许用户选择任意PHP文件。通常最好在脚本中有一个静态的可能性列表;然后你可以调用你喜欢的文件。例如
switch ($_GET['ch']) {
case 'strašni-mikroskop': include 'chapters/strasni-mikroskop.php'; break;
case '☃': include 'chapters/snowman.php'; break;
...
}
问题3.使用<div>
标记链接对于可访问性,可用性和SEO非常不利。为什么不使用普通的<a>
链接?