2010-08-16 22 views
0

我只是想要一個更優雅的自動化解決方案來進行表單驗證。在PHP.net上,我從SQL注入頁面發現了一個很酷的class腳本。這裏是代碼(修改)。假設要通過我的$_POST數組並應用驗證功能。array_map/array_walk保持報告無效回調,未找到和/或未定義

class secure 
{ 
    function secureSuperGlobalPOST($v) 
    { 
    $_POST[$v] = htmlspecialchars(stripslashes($_POST[$v])); 
    $_POST[$v] = str_ireplace("script", "blocked", $_POST[$v]); 
    $_POST[$v] = mysql_escape_string($_POST[$v]); 
    return $_POST[$v]; 
    } 

    function secureGlobals() 
    { 
    // This was originally array_walk; I'm just trying to figure out what's up... 
    array_map('secureSuperGlobalPOST', $_POST); 
    } 
} 

// This last line is attempt at using it. This was not provided with the code. 
secure::secureGlobals(); 

於是我得到這個錯誤:

_「警告:array_map()預計參數1是一個有效的回調,功能 'secureSuperGlobalPOST' 未找到或c無效的函數名稱:\ WAMP \ www \ mysite \ register.php on line 19「_

我一直在尋找永遠,但我不明白爲什麼它不會有效,沒有找到(它在同一類),或爲什麼它會是無效的名字(它是一樣的確切名字!)。

回答

8

聲明secureSuperGlobalPOST靜態和使用:

return array_map('self::secureSuperGlobalPOST', $_POST); 

或:

return array_map(array('self','secureSuperGlobalPOST'), $_POST); 

如果你不想secureGlobalPOST是一個靜態方法:

return array_map(array('secure','secureSuperGlobalPOST'), $_POST); 

但是你必須仍然在上次聲明中記錄返回值。

$result=secure::secureGlobals(); 
+0

這也有效。我猜自己是一個引用自己的關鍵詞,不知道。謝謝! – Tarik 2010-08-16 18:47:51

+0

self用於引用聲明方法的類。 – stillstanding 2010-08-16 18:58:33

+0

再次感謝,我甚至不認爲我會想到在變量中捕獲返回值,我忘了!我不明白靜態方法的東西。如果有可能簡短,可以簡單比較一下。 – Tarik 2010-08-17 05:08:21

3

這是因爲secureSuperGlobalPOST不是全局函數。

你必須要麼把它拿出來之類的,或者使它成爲一個靜態方法和用途:

array_map('secure::secureSuperGlobalPOST', $_POST); 

通過不使用回調以正確的方式方法。更好的辦法是:

function secureVar($v) 
{ 
    return mysql_escape_string(htmlspecialchars(
       str_ireplace("script", "blocked", $v))); 
} 

然後調用

array_walk($_POST, 'secure::secureVar'); 
array_walk($_GET, 'secure::secureVar'); 

所以你能重複使用的代碼。


我想指出的另一件事是,這不是避免XSS的正確方法。這是懶惰的方式。你不應該那樣做。如果你的用戶輸入了一段文字說:「我讀了你的腳本」?事實上,它會變成「我讀你的封鎖」。

+0

This Works。感謝您的解釋! – Tarik 2010-08-16 18:47:01

+0

腳本是在這個例子中,我沒有刪除它。事實上,我認爲它可能是我不明白的技術,儘管它顯然是一個替換字符串函數。感謝提到它,但現在我知道它確實是瘋了! – Tarik 2010-08-17 05:04:30