2017-04-13 51 views
1

對於我的應用程序,用PHP 5+編寫,我有一個common.php,其中包含所有其他頁面。其中我有一個include sanitize.php,其目的是消除URL中使用的任何輸入變量。所以,目標$_GET[]值。PHP輸入GET變量消毒

這只是有一個地方,我可以整理任何變量,如果使用,並在代碼中使用它們。

基於預期/期望的輸入,似乎沒有整潔的方式來淨化。我最初看到的方法是這個sanitize.php有一個foreach循環遍歷所有變量,查找所需的清理類型,然後將清理後的變量添加到單獨的數組中以供我的代碼使用。

而不是使用PHP消毒過濾器,爲了保持它的標準,我想我會使用正則表達式。我想要的類型是alphaonly,字母數字,電子郵件,密碼。雖然「密碼」會允許一些特殊字符,但我想要刪除甚至是逃避潛在的「危險」字符,如'"然後被包含到mysql數據庫中。我們有一個歐洲的用戶羣,所以可能有不同的地區,但我希望這不會成爲太大的問題。

這是一個「好」的解決方案,或者我試圖重新發明輪子?

隨機頁

/mypage.php?c=userid&p=lkasjdlakjsdlakj&z=.... 
(use SANITIZED_SAFE_INPUT_VARS variable only) 

sanitize.php

var aryAllowedGetParamNames = array(
    "c" => "alphaonly",   //login 
    "p" => "alphaemail",  //password 
    "e" => "email"    //email 
    //... 
); 

var sanitizeTypes = array (
    "alphaonly" => "[a-zA-Z]", 
    "alphanumeric" => "[a-zA-Z0-9]", 
    "email" => "[a-zA-Z0-9]...etc" 
); 

var SANITIZED_SAFE_INPUT_VARS = array(); 

foreach ($_GET as $key => $value) { 
    //apply regex and add value to SANITIZED_SAFE_INPUT_VARS 
} 

編輯

似乎有大約在URL中使用密碼的一些意見。我會更詳細地解釋一下。我使用帶有用戶名和密碼參數的_db_tryLogin.php的ajax異步調用,而不是使用用戶名和密碼的POST登錄提示。用戶名始終是6-ALPHA-only文本字符串,密碼是輸入內容的md5。我意識到MD5的意見不夠「安全」。

JS當前MD5的密碼並將其發送到_db_tryLogin.php

-> async : _db_login.php?c=ABCDEF&p=SLKDauwfLKASFUWPOjkjafkKoAWOIFHF2733287 

這將返回「1」或「0」的異步響應。兩者都會導致頁面刷新,但如果_db_tryLogin.php頁面檢測到密碼並且用戶標識符匹配一個數據庫記錄,則將設置會話變量並且該站點知道用戶已登錄。

我使用MD5作爲異步請求快速散列密碼,以免它以明文形式傳輸。

_db_tryLogin.php需要密碼,這是md5(plainpass)再次添加一個SALT和MD5s,然後這就是與DB中的usertable進行比較。

存儲的DB密碼= md5(SALT。md5(plainpass))

+0

而不是通過允許某些chararacters,根本不允許* *的漫長繁瑣的過程會(即刪除)字符你不想接受,如非字母數字或反引號括等它也可以爲您節省大量的努力來使用PHP'strip_tags()'函數。 – Martin

+0

你在這方面花了一些心思。但它通常被認爲是錯誤的方法。而不是將輸入視爲「危險」,請查看您的數據庫API使用情況。逃避和消毒始終是針對具體情況的;不是一個全面的安全小發明。 – mario

+0

你對什麼是消毒?如果你[只]試圖保護你的SQL數據庫**你做錯了,並應該查看* Prepared Statements ***。 – Martin

回答

1

什麼是消毒?如果你[只]試圖保護你的SQL數據庫你做錯了,應該看看準備好的語句

用戶提交的數據應該是從不被信任。接受,是的,值得信賴的 - 不是

而不是經歷一個冗長乏味的過程允許某些字符,只是不允許(即刪除)你不想接受的字符,如非字母數字或反向字符等。它也可以爲您節省很多努力來使用PHP strip_tags()函數。

1)在包含文件中創建你的函數。我會建議在abstract Static Class中創建它,但這有點超出了這個答案的範圍。

2)在此函數/類方法中,添加您要查找的字符以及這些檢查將應用於的數據的定義。您似乎對自己的邏輯過程有了一個好主意,但請注意,由於每個程序員對字符串的需求都不相同,因此不存在確切的代碼答案。 3)使用(2)中定義的標準,您可以使用正則表達式去除無效字符以返回一組「安全」的變量。

例如:

// Remove backtick, single and double quotes from a variable. 
    // using PCRE Regex. 
    $data = preg_relace("/[`"']/","",$data); 

4)使用PHP函數strip_tags()只是做到這一點,從一個字符串中刪除HTML和PHP代碼。

5)對於電子郵件驗證使用PHP $email = filter_var($data, FILTER_SANITIZE_EMAIL);函數,它會比你自己的簡單正則表達式好得多。 使用PHP Filter Validations他們準確地爲您的情況。

6)NEVER信任的輸出數據,即使通過了所有檢查和正則表達式,你可以給它,東西仍然可以打通。總是非常謹慎的用戶提交的數據。 從來沒有信任它。

7)使用準備好的語句進行SQL交互。

8)對於數字類型的快捷方式(INT /浮動),你可以使用PHP的類型轉換到給定的可變因素來作爲某種類型並摧毀它是別的任何的機會:

$number = $_GET['number']; //can be anything. 
$number = (int)$_GET['number']; //must be an integer or zero. 

注:

  • 密碼應a-z而已,但你可以從選擇應該是儘可能多的字符,多多益善。

  • 如果您actioning這裏的努力,都是爲了保護數據庫的安全性和完整性的情況下,你這樣做是錯誤的,並應該使用預處理語句爲你的MySQL互動。

  • 使用var聲明變量,因爲這是從PHP4 and is VERY old停止,它遠遠最好使用可變預條件$(如$variable = true;)。

  • 幽州:

    我們有一個歐洲的用戶羣等不同的語言環境是可能的

    對此我會強烈建議探索PHP mb_string functions因爲PHP本身不mutlibyte安全。

0

我會剛剛開始正則表達式每個變量,如果它不符合要求應用null。這兩項測試中它應該只,或什麼不應該,取其較小者:

$safeValue = (preg_match('/^[a-zA-Z0-9]{0,5}$/',$value) ? $value : ""); 

隨着與參數輸入預處理語句又名

$query = "SELECT x FROM table WHERE id=?"; 
bind_param("si",$var,$var) 

PHP還內置濾鏡進來,如電子郵件和其他)。例如:filter_var($data, FILTER_SANITIZE_EMAIL)

http://php.net/manual/en/filter.filters.sanitize.php

+0

應用'false'而不是null看起來更合乎邏輯,因爲if'語句('===')可以定義它無法正確傳遞正則表達式。但是這種細節是我想到的OP。 – Martin

+0

@Martin通常後來我使用if($ var!=「」){},因此。我完全清空它。 – clearshot66