2011-09-17 109 views
1

明確之前輸入的數據我不知道什麼是將它插入MySQL數據庫之前CELAR輸入數據的最佳方式。 有很多功能:trim,addslashes,mysql_real_escape_string等等。 這時我使用這個簡單的功能:PHP:將其插入到mysql數據庫

function filter($var){ 
    $data = preg_replace('/[^a-zA-Z0-9]/','',$var); 
    $data = trim(addslashes($data)); 
    return $data; 
} 

什麼是做到這一點的最好方法是什麼?由於

+0

這根本不是一個有用的方法: ,並沒有完全防止SQL注入。你正在使用哪個mySQL庫? –

+0

'addslashes()'在這種情況下是多餘的。另外,如果您的應用程序接受unicode輸入,請爲數據庫中的b0rken條目加上自己的支持。 –

+0

您應該根據輸入數據的類型對輸入數據進行清理 - 如果它必須是正整數,或者應該能夠包含一個減號?你不能有一個通用的解決方案。 – Narf

回答

1

是在安全方面,與MySQL打交道時,mysql_real_escape_string() - 總是用這個。總是。

+0

與addslashes()不一樣嗎? – gaggina

+0

不,它不是。它不止於此。 – jancha

0

我建議你看一看prepared statements是非常保護您免受SQL注入的所有形式。

到預處理語句的參數不需要用引號括起來;驅動程序自動處理這個。如果應用程序獨佔使用預準備語句,開發人員可以確保不會發生SQL注入(但是,如果正在使用未轉義的輸入構建查詢的其他部分,則仍然可以執行SQL注入)。

1

出於安全原因,使用mysql_real_escape_string()就足夠了。另一種方法是使用準備好的語句。

但你應該檢查你在你的數據庫要在什麼類型的信息。您可以使用幾種函數和語言結構:類型轉換,filter_*() functions,int_val(),abs(),trim()等等。

0

最好的辦法是做多件事情:

  1. 驗證數據
  2. 乾淨的數據
  3. 逃生日期

驗證是檢查數據是否你已經有了品牌任何意義。例如,如果你預計出生日期,你檢查格式是否正確,甚至可能是否意味着日期。這不僅有安全方面的好處,而且可以防止一些(不是全部)錯誤的數據錯誤。那裏的工具取決於案例,正則表達式(preg_match)通常是一個不錯的選擇。

清理數據通常不是真的需要,但很好,例如,如果用戶鍵入某個值,則使用trim()來分割一些空格,這可能是複製和粘貼等錯誤。這沒有安全上的好處,但提高了數據的整體質量。這很好。

的這些東西都應該在你的腳本月初完成。雖然「早」取決於你的建築。有時這是有道理的,先清理一個驗證,然後立即做(preg_replace)

然後,當發送數據到數據庫或將其放入HTML或任何這些東西oyu必須相應地轉移到系統正在使用。您應該爲所有數據做到這一點,即使您事先確認了格式的安全性。當與mysql交談時,這些是real_escape_string函數,例如,對於HTML,它是htmlentities()或htmlspecialchars()。對於數據庫來說,它也是一個好主意,也可以查看準備好的語句,或者PDO-> prepare + execute()或mysqli-> prepare()+ execute()