2014-10-17 55 views
0
<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

嘗試'$ chapter = rawurlencode(「chapters /」。$ _GET [「ch」]。「.php」);' – Michel 2014-10-17 11:05:45

+0

@Michel,謝謝,但它不起作用。 – bonaca 2014-10-17 11:15:52

+0

這可能是您的服務器不喜歡文件和文件夾名稱中的特殊字符。嘗試在js中對鏈接進行硬編碼('location.href =「index.php?ch =strašni-mikroskop」;')如果它仍然不起作用,那可能是服務器。 – Michel 2014-10-17 11:24:47

回答

0
location.href = "index.php?ch=" + c; 

您需要在這裏encodeURIComponent(c)。否則,URL中特殊的任何字符(如%&)將會破壞URL。這也確保了在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本身來獲得無限循環並拒絕服務器。

您可以避免使用安全編碼方案的這兩個問題。例如對於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>聯繫是非常糟糕的可訪問性,可用性和搜索引擎優化。爲什麼不使用正常的<a>鏈接?