2012-01-10 44 views
0

可以使用由於表單提交或任何其他請求而清理傳入輸入的函數嗎?這是節省時間,但有效性和效率的問題仍然困擾着我。例如,建議有一個在php中結合了兩個或更多內置消毒功能的santizing功能?

function clearSpecialChars($str) 
    { 
    $str=htmlentities($str); 
    $str=strip_tags($str); 
    $str=mysql_real_escape_string($str); 

    return $str; 
    } 

,這樣,當我得到一個表單提交我做的:

$username=clearSpecialChars($_REQUEST['username']); 

    $email=clearSpecialChars($_REQUEST['email']); 

從根本上說,我不希望從用戶的任何HTML輸入。

+0

沒有放之四海而皆準的。所有這只是一個懶惰的嘗試 – Cheekysoft 2012-01-10 09:35:16

+0

我不明白你的意思是,上述方法比一步一步地使用它們更容易? – jmishra 2012-01-10 09:36:50

+0

一方面試圖解決SQL注入的漏洞,另一方面嘗試接近跨站腳本的脆弱性(雖然每個腳本都不能成功地完成任務,如果不是非常小心地使用它們,並且通常與其他工具結合使用),它們應該永遠不會按順序使用,因爲它們與彼此沒有任何關係。 – Cheekysoft 2012-01-10 09:42:10

回答

2

每個函數都有其自己的用途,您不應該使用任何不適用於其預期用途的函數。

  1. 您應該在使用mysql查詢中的參數之前使用mysql_real_escape_string。
  2. 在輸出到頁面之前,您應該使用htmlspecialchars。

就是這樣。

+0

請*不要*使用'mysql_real_escape_string()',除非它真的是你最後的選擇 - 它太容易誤用它,最終容易受到SQL注射,或將其用於易受攻擊的配置。請嘗試使用參數化查詢,而不是像'mysqli'或'PDO'庫。 – Cheekysoft 2012-01-10 09:38:55

+0

你是什麼意思「太容易誤用」? – Orentet 2012-01-10 09:40:18

+0

'$ sql =「select * from users where id =」+ mysql_real_escape_string($ _POST ['userid']);'一個非常常見的例子; SQL注入在那裏。 – Cheekysoft 2012-01-10 09:43:58

0

是的,您可以創建一個簡單的函數,在使用它之前清理值。我用一個函數那樣:

function sanitize($value) 
{ 
    return htmlentities(addslashes($value)); 
} 

哪些逃離「與」和所有適用的字符轉換成HTML實體礦與其他選項更復雜,但你可以從它開始

+0

fyi:這不會對單引號進行htmlencode編碼,所以當注入上下文位於HTML標籤內部時,容易受到XSS的影響,但不在雙引號屬性值內。還存在其他弱點,例如多字節攻擊(因爲不考慮字符集)和一些特定於瀏覽器的語法漏洞。 – Cheekysoft 2012-01-10 11:07:03

+0

是的,所以我說我使用更復雜的功能。 我以爲他想知道如何以簡單的方式使用一些不同的功能,因此很難在單個答案中談論安全問題;) – 2012-01-10 11:15:40

+0

當然是。我認爲讀者從這個角度解決的主要問題是任何方法論都只能用於特定的地方。在考慮注入漏洞時,考慮**注入字符串的輸出的語法/結構中的哪裏**,同樣重要,因爲要考慮**如何執行輸出編碼 - 巨型提示:輸出編碼與位置有關。(並考慮應該避免注入的地方) – Cheekysoft 2012-01-10 13:48:50