2013-02-07 311 views
1

在PHP中,我有以下reqular表達:正則表達式替換

$regexp = "/^([-a-z0-9.,[email protected]'?_-\s])+$/i"; 

我試着去驗證我的網站上的聯繫方式(特別是消息字段),以確保沒有討厭的代碼已被輸入。我遇到的問題是我需要允許某些正常的標點符號和字符,但是我擔心它們可能會被用於插入惡意代碼。

對於任何不服從上述表達式的字符,我想將其替換以使其安全。兩個問題:

  1. 如何更換?
  2. 我應該用什麼替換角色?例如,我不允許括號()。最好的做法是將其替換爲"(" ")"\(\)

編輯

的數據將被髮送到電子郵件地址,並保存到數據庫

+0

爲什麼你擔心聯繫表單中的惡意代碼?信息在哪裏去?另一個網站?你的郵件?你可能會過度這樣做。 –

+3

根據您使用它的位置轉移數據。如果插入到數據庫中,請使用PDO或正確的* _escape函數。在網站上輸出時,請使用htmlspecialchars和urlencode。在shell環境中使用時,escapeshellcmd/escapeshellarg。等等...請參閱問題[»用PHP清理用戶輸入的最佳方法是什麼?](http://stackoverflow.com/q/129677/112968) – knittl

+0

這一切都取決於正在處理的數據。如果它被輸出到瀏覽器,插入數據庫,通過一些命令行運行,都需要不同的衛生手段。 –

回答

1

Mmh的你爲什麼不只是允許接觸形式插入每個字符,將他們全部在表單提交之後,只要他們到達php腳本,立刻使用htmlentities?這樣,你的用戶將能夠說出他們想要什麼,你不會有「惡意代碼」 :)

And do not forget to use a proper database wrapper (PDO) 
or at least escape when inserting into the database. 

– knittl 

編輯任何問題:加入Knittl的報價再次強調它:)

+1

不要忘記使用正確的數據庫包裝(PDO) - 或者至少在插入到數據庫時進行轉義。 – knittl

+1

是的。沒有對它說什麼,因爲它在你對這個問題的評論中告訴你:) –

+2

你不能強調這一點。 – knittl

0

使用filter extension。更具體地說,使用filter_input()函數和sanitizing filter。例如:

$message = filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING); 

這將確保標籤被剝離出消息,並且處理更安全。

但是,它確實是而不是表示您應該將其視爲100%安全。將消息保存到數據庫時,您仍然需要採取防範措施(例如使用數據庫驅動程序的轉義方法,並從消息中刪除不需要/不需要/可疑的東西),並確保輸出到客戶端是安全的。