2017-05-07 55 views
1

這是我第一個使用Flask和Python的應用程序。如何在Flask中驗證URL參數

我使用下面的URL格式從Arduino發送POST請求到在Pythonanywhere服務器實例上運行的燒瓶應用程序。

有效POST請求:3 URL參數 http://voyagers.pythonanywhere.com/senddata?node=1234&lat=18.5580&lng=73.8075

我需要通過某種形式的驗證URL以阻止來自進一步處理該請求。我希望這可以保護我的應用程序免受未經身份驗證的POST請求。

說是這樣的:任何超過3個URL參數 http://voyagers.pythonanywhere.com/senddata?node=324&lat=18.5580&lng=73.8075&a=c&a=d

我怎樣才能在瓶實現這一目標?

還建議,如果有更好的方式可以用來保護應用程序從未經授權的請求。

+1

您在發出請求的授權和該請求中的查詢參數數量之間看到了什麼連接? – jonrsharpe

+0

@jonrsharpe這裏的授權我的意思是說,如果硬件設備(arduino節點)發送包含超過3個URL參數的POST請求,就像我上面提到的那樣。我不想處理這樣的請求。說更多的錯誤檢查! (P.S:原諒適當的行話,新手到應用程序開發) –

+0

你看過http://stackoverflow.com/q/29568540/3001761?驗證輸入與保護應用程序不是一回事,因此您想要實現的功能並不十分清楚。如果你的意思是你想檢查查詢參數字典中唯一的鍵是'node','lat'和'lng',*你有沒有試過寫過?* – jonrsharpe

回答

2

你可以得到flask驗證參數並自動拋出一個錯誤,如果你願意從URL交換機參數(即在URL中的符號「?」之後的任何東西),以路徑參數(即任何位於Path HTTP標頭中,或位於第一個'/'之後且在'?'之前的URL部分)。

你舉的例子可能是這樣的:

@app.route('/post/<int:node_id>/<float:lat>/<float:lng>', methods=['POST']) 
def process_post_request(node_id, lat, lng): 
    # do some work 
    return your_result 

然後,你可以發送請求的URL會看起來例如像這樣:http://example.com/post/1234/-11.45/21.34

你可以找到更多關於這個在這裏:http://flask.pocoo.org/docs/0.12/quickstart/#variable-rules

爲了確保安全訪問,您可以在這裏使用一些示例代碼片段:​​

我建議僅限於訪問HTTPS,並使用基本身份驗證,如果你只是玩耍。這可以用一個簡單的裝飾器來完成,如下所述:http://flask.pocoo.org/snippets/8/

您將在瀏覽器中得到一個提示,要求輸入用戶名和密碼,瀏覽器會在會話期間記住它。或者,您可以在Authorization標頭中以base64編碼形式設置用戶名和密碼:https://en.wikipedia.org/wiki/Basic_access_authentication

+0

謝謝Grepe !.以上是我將嘗試的一種解決方案。在'?'之後有什麼類似的參數可以完成。在URL?中。 而不是將URL修改爲'node_id/lat/long'? –

+0

@balaji據我所知,燒瓶內沒有URL參數驗證。你必須自己寫。 URL參數幾乎免費且易於更改和/或追加而不會破壞任何內容......這就是爲什麼它們被用於例如用於跟蹤目的(嘗試點擊幾乎任何橫幅廣告並查看您的網址)。 – grepe