2011-12-09 25 views
2

我正在寫一個快速web.py應用程序,並從web.input取數據...使用web.py的web.database時應該如何防止濫用?

import web 
urls = (
    '/', 'something', 
) 
app = web.application(urls, globals()) 
db = web.database(dbn='postgres', db='database', user='username', password='password', host='127.0.0.1') 
class something: 
    def GET(self): 
     i = web.input() 
     return db.select('foo.table', where="column=$variable", vars={'variable':i.input, }) 
if __name__ == "__main__": app.run() 

我應該擔心路過i.input到db.select(或查詢等),因爲我做的作爲變種的一部分? SQL注入的可能性等?


編輯: 我一直在這個自己打轉轉,試圖得到一些討厭happenning。使用引號例如播放,http://localhost:8080/?id=13' or 'x' ='x結果很好地逃脫了被顯示在例外SQL:

<sql: 'select * from foo.table where id = "13\' or \'x\'=\'x"'> 

我已經嘗試了一些其他常見的測試,互聯網提出並覺得我很幸福web.py被處理與sanitisation ...會有其他人能夠評論?

回答

6

http://webpy.org/cookbook/query說:

爲了防止SQL注入攻擊,db.query也接受在db.select描述的「瓦爾」 語法:

results = db.query("SELECT * FROM users WHERE id=$id", vars={'id':10}) 

這會逃跑用戶輸入,如果你信任他們的「身份證」 變量。

所以我想它就這麼簡單。

當然,我知道我還需要驗證,如果我將要插入它會將用戶輸入...

+1

當您將它從數據庫中取出時,請不要忘記將它轉義出來... –

-1

是的,因爲有些人可以改變這個變量,特別是如果它來自一個url來說一些類似「selecte * from table where id = [variable + DELETE TABLE [。這是一個sql注入的例子。如果用戶有任何想法你的後端數據對象的命名

我不完全確定Python將如何處理SQL語句變量的參數化,但我不得不執行類似的安全修復冷融合網站和。ASP.net網站

+0

你提供了一個通用的答案,或者這是基於web.py的真實知識嗎?編輯:我從編輯中看到,這不是基於web.py的知識......我懷疑還有比我們知道的更多的事情。 – PriceChild

+0

看到我對這個問題的編輯,例如,肯定會有一些消毒。我知道我可以按照「查詢的方式」進行操作,但我無法期望知道如何測試每種可能的SQL注入。我正在尋找前者的建議,而不是後者。 – PriceChild

+0

如果您的web.py db模塊正確無法執行SQL注入攻擊。 –

4

的「漂亮逃脫SQL」你看不要緊,因爲它從來沒有發送到數據庫引擎。

在所有情況下,除非手動將值插入到SQL請求字符串中,否則您可以安全地進行SQL注入。這包括選擇/插入/更新/刪除方法以及$variable_name替換樣式。在這兩種情況下,SQL請求都不是以文本形式完全組裝,而是正確地轉換爲SQL準備語句並由DB引擎編譯。只有在這之後,參數纔會被替換爲語句執行。因此,除非您使用不受信任的數據手動構建SQL查詢字符串和/或其部分內容,否則您是安全的。

不幸的是,我無法提供比the source code of the module更好的鏈接,因爲它是我唯一的信息來源。