2010-08-09 72 views
7

我通常使用此功能將它們存儲到我的數據庫之前清空我的表單輸入:消毒接觸形式沒有mysql_real_escape_string

//Function to sanitize values received from the form. Prevents SQL injection 
function clean($str) { 
    $str = @trim($str); 
    if(get_magic_quotes_gpc()) { 
     $str = stripslashes($str); 
    } 
    return mysql_real_escape_string($str); 
} 

直到今天我沒有意識到mysql_real_escape_string需要一個數據庫連接,因爲我只是完成在將數據存儲到數據庫之前清理數據時使用它。

我嘗試使用聯繫表單上的功能,並得到「無法建立服務器的鏈接」錯誤。我可以連接到數據庫,但沒有必要,因爲我只是試圖在數據通過聯繫表單發送到我的電子郵件之前對其進行清理。

對未存儲在mysql數據庫中的數據進行清理的最佳方式是什麼?這些數據是否仍需要清理?

回答

15

使用filter_var()

http://php.net/manual/en/function.filter-var.php

,如果你想清理的郵件,如:

$_POST['email'] = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 

到消息

$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING); 

是enogth

+0

你的意思是什麼特定的過濾器?有這麼多的 – 2010-08-09 05:33:22

1

mysql_real_escape_string清理數據的目的是爲了避免SQL注入。如果你不使用SQL,你已經免疫。

男性不會得宮頸癌。

使用適合您需要避免的特殊字符的清理功能。理想情況下,不要剝去不會造成傷害的東西。

+0

mysql_real_escape_string獨自幫助什麼 – 2010-08-09 05:21:21

-1

整個概念是錯誤的。 此功能對於電子郵件甚至數據庫不起作用。

mysql_real_escape_string不「清理」任何東西。它只是轉義分隔符而沒有別的。只是爲了避免語法錯誤,如果你有一個分隔符在您的數據:被轉義數據

SELECT * FROM table WHERE name = 'it's me' # error! 

後,您的數據成爲'it\'s me'並沒有錯誤。
因此,此功能僅適用於SQL查詢和數據,僅包含在報價中

因此,在沒有引號的情況下只做mysql_real_escape_string沒有意義。 a)單獨使用mysql_real_escape_string
。 b)正好在查詢字符串組合之前,而不是在其他地方
c)只有數據將被包含在引號中。
d)所有其他數據需要其他方式的消毒

至於電子郵件,你不需要任何消毒,你發送它作爲純文本。 您必須採取的唯一措施是針對郵件注入
雖然沒有什麼大不了的。只需將用戶輸入放入消息體。不進入主題,往返或任何其他標題。只有郵件正文。你是安全的

+0

什麼?始終使用衛生設備。永遠不要相信用戶輸入這樣的建議假設:a)沒有辦法在腳本中注入不同的頭文件(如果你沒有對輸入進行消毒,你怎麼知道的?)和b)所有的郵件客戶端都會做正確的事情文本/平頭。我嚴重懷疑這一點。 – Cfreak 2010-08-09 05:24:37

+0

@Cfreak這裏唯一明智的一點是關於一些奇怪的郵件客戶端。有一個例子?但你「永遠不相信用戶的輸入」無心的祈禱確實很有趣。爲什麼不在判斷別人之前得到一些經驗? – 2010-08-09 05:54:05

-1

(我是新來的StackOverflow,所以我要對這個錯誤的方式/做得不好我的回答的造型隨時讓我知道。)

糾正我,如果我錯了,因爲我現在也在處理同一個問題,但我認爲使用filter_var的已接受答案已經足夠,因爲攻擊者可以使用unicode繞過此問題。

例: 「B#& 99; c#& 58;」 (已添加空格以便stackoverflow將正確顯示)

這不會從字符串中刪除,並且以後會被替換爲「密件抄送:」。

這是我的解決方案,但可能有更好的方法。如果有人知道我喜歡聽到它的話。

$string = str_replace("&", "(and)", $string); 
    $string = str_replace("#", "(num)", $string); 
    $string = str_replace(";", "(semi-colon)", $string); 
    $string = str_replace(":", "(colon)", $string); 
    $string = str_replace("@", "(at)", $string); 
    $string = str_replace("\\", "(backslash)", $string); 
    $string = filter_var($string, FILTER_SANITIZE_STRING);