2012-04-29 127 views
1

我需要一種方法來包含一個基於URL中的語言的PHP文件。現在這個腳本正在工作,但是當我有10或20種語言時,我想要一些較短的腳本,它仍然包含相同的信息。問題是,如果將URL中的'lg'更改爲不存在的語言,我想使用英語。較短的語言檢測

$langue=$_GET['lg']; 
if ($langue == "da") 
{ include"da.php";} 
elseif ($langue == "de") 
{ include"de.php";} 
elseif ($langue == "en") 
{ include"en.php";} 
elseif ($langue == "es") 
{ include"es.php";} 
else { include"en.php";} 

任何人都可以縮短這個嗎?

+0

你剛剛接受的代碼,會讓你的網站很容易被黑屏/ – 2012-04-29 14:34:25

回答

5
if (empty($_GET['lg'])) { 
    $lang = "en"; 
} else { 
    $lang = $_GET['lg']; 
} 
if (!preg_match('~^[a-z]{2}$~',$lang)) { 
    header('HTTP/1.1 403 Forbidden'); 
    exit; 
} 
$langfile = "$lang.php"; 
if (!is_readable($langfile)) { 
    $lang  = "en"; 
    $langfile = 'en.php'; 
} 
include $langfile; 
+0

這是有效的,但它確實檢查文件是否存在於磁盤上,這是不必要的開銷。 – Nadh 2012-04-29 14:16:04

+0

當它將是我的應用程序發出的每個請求的唯一的統計數據,而不是目前的數百個 - 我會開始考慮對其進行優化 – 2012-05-01 07:53:07

+0

好吧..這似乎是,這實際上是最好的腳本.. 。但是我的問題是,因爲安全性很高。:我必須通過使用「允許」數組來結合這個腳本嗎?你能告訴我什麼是「preg_match」嗎? – Philip 2012-05-01 07:54:17

1

只需使用:

$lang = (file_exists($_GET['lg'] . '.php')) ? $_GET['lg'] . '.php' : 'en.php'; 
include($lang); 

編輯:依照意見,我應該指出,這個代碼,雖然功能和簡潔的,確實是非常容易受到惡意攻擊,基本上任何人都可以設置URL變量配置或其他敏感文件,然後在您的網站上發起攻擊或竊取您的數據。於是致電前請務必驗證$lang變量包括 - 也許用一個簡單的:

$allowed = array('en.php', 'fr.php'); 
if(in_array($lang, $allowed)){ 
    include($lang); 
} 
+2

對不起是什麼倒票? – 2012-04-29 14:13:23

+0

謝謝..這工作! – Philip 2012-04-29 14:26:28

+0

我不知道..我沒有做任何事情,但將其標記爲正確..:/ – Philip 2012-04-29 14:28:53

1
<?php 
    $languages = array('da', 'de', 'en', 'es'); 

    $lang = 'en'; 
    if(!empty($_GET['lg']) && array_search($_GET['lg'], $languages) !== false) { 
     $lang = $_GET['lg']; 
    } 
    include $lang.'.php'; 
?> 
0

什麼這樣的事情?

if(isset($_REQUEST['lg']) && $_REQUEST['lg'] != '') $lg = $_REQUEST['lg']; 

if(strstr($lg, '.')) die('Don\'t allow any . in the languages'); 

if(file_exists('path_to_language_files/'.$lg.'.php') { 
    include('path_to_language_files/'.$lg.'.php'); 
} else { 
    include('path_to_language_files/en.php'); 
} 
+0

當我使用腳本時,由於缺少')'而出現了一些錯誤,並且「不允許任何...」命令因單引號而被破壞。但是當我閱讀腳本時好,我只是有一個關於這個問題.. if(isset($ _ REQUEST ['lg'] && $ _REQUEST ['lg']!='')) 我該如何改變這是正確的?它一直告訴有一個錯誤... – Philip 2012-04-29 14:23:58

+0

對不起,我已經更新了代碼現在,所以現在應該沒問題,但你可能已經修好了:) – fhugas 2012-04-30 00:03:52

0

我只使用兩種語言的頁面,但我需要它開放供增加更多,因此,我解決了這樣同樣的問題:

$allowed=array("da","de","en","es"); 
$default="de.php"; 
include(array_search($_GET["lg"],$allowed) === false ? $default : $allowed[array_search($_GET["lg"] , $allowed)].".php"); 

它應該工作類似,不同之處你可以指定哪些文件是允許的,並且他們的名字是從數組中取出的,所以它應該對假請求是安全的。

+0

你有點遲了這個答案 – 2012-04-29 15:50:02

+0

試圖避免你的不安全的代碼,無論如何,你升級它,所以它確定。 – Kyborek 2012-05-02 20:21:32