2013-07-07 50 views
-1

我需要一個正則表達式來使用preg_replace php函數在搜索表單中輸入用於SQL在MySQL多語言utf8數據庫中進行全文搜索。我曾考慮使用PHP filter_varFILTER_SANITIZE_STRING,但我結束了preg_replace需要正則表達式爲UTF8多語言搜索查詢

我想這些功能:

  1. 保留空間,只有一個,如果更多的行(串行空格)
  2. 保持雙報價只有一個,如果更多的行(這樣我就可以在IN BOOLEAN MODE使用它phrase
  3. 保持- & + &「〜」,只有一個,如果多個連續
  4. 因爲我希望它是多語言它應該考慮Unicode(utf8)字母
  5. 我沒有/需要口音考慮。

這是我做了什麼:

$q = addslashes($q); 
$q = preg_replace('/[^\w\d\s\s+\p{L}]/u', "", $q); 

但產量不會像滿足我的報價(")和減號(-)。我該如何寫一個安全的查詢字符串在我的搜索框中使用?

有沒有比使用preg_replace更好的做法?

+2

如果你這樣做是爲了防止SQL注入,那麼你做錯了。使用[預先準備的語句](http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php/60496#60496)。 [差異](http://www.youtube.com/watch?v=nLinqtCfhKY)。您可以使用'preg_match'來檢測這些無效查詢,並將有趣的消息返回給客戶端NT。 – HamZa

+0

感謝您的評論。沒有注射。我只是使用'SELECT',而不是'INSERT'。但它應該是一個明確的查詢來執行更好的搜索 – Trix

+2

@Arash是的,還有一個簡單的''; DROP TABLE abcd; --'仍然可以工作。不管你使用什麼命令,攻擊者仍然可以像SQL注入一樣刪除東西,通常可以執行完全不同的命令。 – Manishearth

回答

1

你必須做2 preg_replace。

1不受任何替換無效字符:

$q = preg_replace('/[^\p{L}\d\s~+"-]+/', '', $q); 

2 - 替換多個字符,如空格, - ,+,」 - 只有一個:

$q = preg_replace('/([\s~+"-])\1+/', "$1", $q);