2011-09-15 24 views
2

我想創建一個正則表達式客戶端驗證(也將發生服務器端驗證之前)防止SQL /腳本注入即類似的東西 - 其中工作正則表達式阻止sql /腳本注入

(script)|(<)|(>)|(%3c)|(%3e)|(SELECT) |(UPDATE) |(INSERT) |(DELETE)|(GRANT) |(REVOKE)|(UNION)|(<)|(>) 

,這是什麼(以上)的表達,所以我可以得到它的工作正確的格式?

例如我的電子郵件檢查是這樣

(/^[^\\W][a-zA-Z0-9\\_\\-\\.]+([a-zA-Z0-9\\_\\-\\.]+)*\\@[a-zA-Z0-9_]+(\\.[a-zA-Z0-9_]+)*\\.[a-zA-Z]{2,4}$/)) 

哦,如果你能想到什麼要補充,請「吶喊」。

+1

,而不是試圖驗證輸入,只需確保在字符串中的特殊字符進行轉義。 – brain

+1

爲什麼哦爲什麼?在服務器端代碼中使用適當的轉義設施來轉義SQL參數,以及要插入到HTML或其他地方的文本。防止任何注射可能性,並消除任何「注射預防檢查」的需要。 – Qtax

+0

它允許用戶添加其中包含SQL文本的文章等。考慮一下,你最終可能會在以後重用這段代碼。 – ewanm89

回答

3

不能以任何方式阻止SQL注入嘗試在客戶端上。這是一個可怕的,可怕的想法,它不能幫助你,但可能會給真正的用戶帶來痛苦。它不會阻止任何有可能實際利用SQLi的人。

就正則表達式而言,您需要在開始處和結尾處添加/,例如在郵件示例中,表示它是一個正則表達式。另外,我認爲正則表達式的設計是有缺陷的,因爲它仍然允許許多注入向量。例如,它允許可怕的單引號', - 評論和其他。它甚至沒有開始涵蓋你的RDBMS的所有內置函數,可能會被敲響。攻擊者通常會利用例如SELECT語句已經在服務器端,所以刪除它們可能也無濟於事。

你最好的防禦方法就是使用服務器端的參數化查詢(例如pg_prepare爲PHP & Postgres的)

+0

好吧,換句話說,我只想要a-z A-Z 0-9。 ,?無論如何,該網站的真正用戶不需要使用腳本等文字。 –

+0

/[a-zA-Z0-9.,?]*/將匹配爲只包含這些字符的任何字符串,如果有其他字符則爲false。 – sillyMunky

+0

轉義所有輸入字符串,並使用參數化查詢。 – ewanm89

0

這是比較常見的逃避像控制字符'和'這樣一個仍然可以進入SQL代碼到數據庫,說它在CMS上,我添加了一篇關於SQL注入的文章。我想在不觸發注射的情況下使用這些文字和字符。看着它,它似乎是與HTML基地的東西,所以轉換<和> & lt;和將會清理任何和所有html標籤,同時仍然允許HTML演示內容被顯示。

如前所述,這應該都是服務器端,因爲它進入系統。

1

對許多人來說,SQL注入和逃逸的聲音很神奇,就像屏蔽一些神祕的危險一樣,但是:不要害怕它 - 它不是什麼神奇的東西。這只是啓用查詢處理特殊字符的方法。

所以,不要發明新的魔法盾牌和方法如何保護神奇的注射危險!而是嘗試瞭解how escaping of the input works

2

通常Sql Injection會在傳遞給sql命令的參數(如insert,update,delete或select)的字符串中發生。這個正則表達式驗證sql命令中是否有任何內聯或塊註釋。

/[\t\r\n]|(--[^\r\n]*)|(\/\*[\w\W]*?(?=\*)\*\/)/gi