2010-01-14 18 views
1

由於沒有函數來檢查一個字符串是否在輸入到數據庫之前被轉義,我怎麼能用正則表達式來做到這一點?功能來檢查一個字符串是否爲mysql的反斜槓

$string = 'some" string'; 
if(!preg_match('//',$string)) 
{ 
    $string = mysqli_real_escape_string($string); 
} 

PHP手冊:

編碼NUL mysqli_real_escape_string反斜線字符(ASCII 0),\ N,\ r \,」,」,與控制-Z

+1

在某些字符之前檢查是否有反斜槓並不難,但不可能檢查大塊文本中的反斜槓是否適用於任何任意應用程序。 – 2010-01-14 16:35:16

+0

請結合您的代碼,讓您唯一稱呼mysqli_real_escape_string的地方就在您創建sql語句之前。那麼你不需要知道它是否已經完成。 – jmucchiello 2010-01-14 16:39:36

+0

這個以前的答案是正確的。 http://stackoverflow.com/questions/2065391/php-what-happens-when-a-string-is-double-times-mysqlirealescapestring/2065428#2065428 – 2010-01-14 16:39:11

回答

3

不要試圖做到這一點。

如果您試圖想出一種方法來確定字符串是否被轉義,那麼有人可以進入並製作一個會欺騙您的檢測方法的字符串。例如,如果您使用「\」作爲測試來確保斜槓被轉義,我可以給您一個像"'; DROP DATABASE dbname(); --\\"這樣的字符串,它可以通過您的檢查,但仍然是可怕的錯誤。

如果無論出於何種原因無法使用存儲過程和/或正確的參數處理,確保字符串乾淨的唯一方法是清理每個不可信源的每個字符串。

3

有。沒有函數來檢查一個字符串是否被轉義,因爲沒有邏輯方法來判斷一個字符串是否被轉義了。

It\'s nice 

逃脫了嗎?你怎麼知道的?它是一個逃脫的撇號,還是一個非轉義的反斜槓和撇號?

轉義是一個進程,而不是一個字符串的屬性。您必須始終知道您是否已針對特定上下文轉義了字符串。做到這一點的最好方法是讓字符串保持原始和未轉義狀態,直到它們離開另一個上下文爲止。因此,除非實際連接成一個SQL字符串,否則不要調用mysql_real_escape_string。不要致電htmlspecialchars,直到您迴應HTML輸出爲止。