![](/img/trans.png)
[英]Meteor.userId().username is “undefined” when user is logged in
[英]Meteor.userId is changeable
玩弄Meteor,我發現即使刪除了不安全的軟件包,客戶端也可以更改Meteor.userId函數。 例如,
Meteor.userId=function() {return "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"}
可以使用Meteor.default_connection.userId()
(重定向的函數)完成。 我如何確保這一點?
這是一個很好的問題,因為它顯示了Meteor安全模型的工作原理。
這里沒有安全問題,因為Meteor 從不信任客戶端代碼。
在Meteor中,只有服務器決定每個客戶端有權訪問哪些數據(請參閱Meteor.publish )以及允許每個客戶端更改哪些數據(請參閱Meteor.allow )。 當客戶端向服務器進行身份驗證時,服務器會存儲用戶的ID。 在該客戶端注銷之前,它會將該ID作為userId
提供給服務器上的Meteor.publish
和Meteor.allow
函數。
Meteor還會在客戶端上發送用戶ID,因為您當然希望根據登錄的人員更改客戶端的行為方式以及屏幕上的內容。正如您所說,我們無法阻止惡意客戶端隨意更改它的任何JavaScript代碼都可以改變它認為的用戶ID! 但這樣做並不會給客戶端任何新的權限,因為它仍然只是制定安全決策的服務器代碼。
您可以使用安全方應用程序嘗試此操作:
$ meteor create --example parties
制作派對應用程序 Meteor.userId()
以獲取用戶的ID。 Meteor.userId()
。 所以現在你偽造了客戶認為它是你的用戶。 但服務器知道的更好。 屏幕上仍然沒有派對,您無法更新派對集合以更改該派對信息。
實際上,將客戶端用戶ID設置為您想要的任何內容都是完全安全的! 您可以直接進入帳戶系統並調用Meteor.default_connection.setUserId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
。 試試吧,你會看到右上角的登錄按鈕變成動畫。 那是因為客戶Meteor.user()
在調用Meteor.user()
來顯示您剛剛設置的登錄用戶的電子郵件地址。 但是因為您沒有以該用戶身份登錄服務器,所以它不會發布有關該用戶的任何信息,而您只是獲得了spinny。
這是一個非常強大的安全模型。 您不必擔心任何客戶端代碼,即使在大多數代碼所在的大多數應用程序中都存在! 只要您編寫安全服務器方法,發布函數和允許/拒絕規則,無論客戶端嘗試做什么,您都會被完全鎖定。
我剛剛使用兩個瀏覽器測試了Meteor,並在每個瀏覽器之間復制了本地存儲Meteor.userId
和Meteor.loginToken
,他們都將我作為同一個人登錄。 當我退出一個時,我仍然可以在另一個中發布。
我認為這不像現在這樣安全。
如果我可以復制這些值並仍然被視為同一個用戶,即使我使用的是其他瀏覽器,那么它根本就不安全。
更新
經過反思......
我想可以在登錄時記錄用戶的IP地址 。 然后,如果用戶嘗試訪問並且IP地址不同,您可以要求他們再次登錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.