簡體   English   中英

服務器端urllib2.urlopen和用戶的url的安全注意事項

[英]Security considerations with server side urllib2.urlopen with url from user

我希望用戶能夠通過提供URL從網絡上載圖像。 由於可能的CORS問題和防止熱鏈接,我不認為我可以讓客戶端來獲取圖像並上傳它,所以我要讓服務器來做。

最大的問題是用戶只需輸入file:///home/user/secret_image.jpg 該URL被發送到服務器,django高興地獲取它,它是一個本地服務器端文件,將其托管給全世界查看。 有沒有一種方法可以限制對外部資源的請求? 如何使這種方法安全(至少-ish)?

其他一些問題可能是用戶提供了可以解析為本地地址的主機名,或者是提供了重定向到本地地址的公共URL。 甚至LAN上通常無法訪問的其他設備。

過濾URL文本不是一種選擇。 在允許urllib繼續之前,我也許可以檢查IP是否路由到網關並且目標是否在我的子網之外。 我可以阻止任何重定向,但是在某些情況下這可能是有用的功能,因此我可以編寫重定向處理程序以重新檢查IP。 現在,這開始感覺像是一項修補工作,而不是一個很好的健壯的“萬事俱備”的解決方案。

我也正在做一些基本的事情,例如read(max_size) ,以防文件過大,使用python-magic檢查mimetype並選擇擴展名,使用django-ratelimit並設置對urlopen()的調用超時。

編輯: 相關答案

鑒於這可能涉及大量的網絡I / O,因此我將工作移到了“文件下載工作者”,例如使用Celery ,但是即使是本地出產的任何其他解決方案也都可以做到這一點

文件系統

下一部分是,一旦您將主要的Django部署與其工作人員分開,則可以使用另一個沒有特權的OS用戶來運行該工作人員,您可以在chroot或其他監獄環境中運行該工作人員。 這將限制工作人員在其文件系統上看到的內容。

網絡接口

至於網絡接口,您可以設置防火牆規則,例如,我相信在Linux OS上, iptables可以為每個用戶和每個網絡接口設置規則。 這樣一來,您就可以限制工作人員的用戶可以在其網絡上執行的操作。

底線

最重要的是,我將任務轉移到一個單獨的工作程序中,該工作程序具有對計算機資源的無特權和受限訪問權限,而不是繼承主Django應用程序的權限。 賦予工作人員的唯一特權是可以訪問Internet,獲取一些文件,將其寫回到磁盤,僅此而已。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM