對於我的應用程序,用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))
而不是通過允許某些chararacters,根本不允許* *的漫長繁瑣的過程會(即刪除)字符你不想接受,如非字母數字或反引號括等它也可以爲您節省大量的努力來使用PHP'strip_tags()'函數。 – Martin
你在這方面花了一些心思。但它通常被認爲是錯誤的方法。而不是將輸入視爲「危險」,請查看您的數據庫API使用情況。逃避和消毒始終是針對具體情況的;不是一個全面的安全小發明。 – mario
你對什麼是消毒?如果你[只]試圖保護你的SQL數據庫**你做錯了,並應該查看* Prepared Statements ***。 – Martin