如何使用带有unicode字符的php $ _GET变量?

时间:2014-10-17 10:53:32

标签: php jquery unicode

<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。

1 个答案:

答案 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>链接?