寫這篇文章是因爲最近在產品登陸受權頁面上,到底如何返回錯誤提示引起的一些思考,調研後作下總結。php
登陸和受權在如今的互聯網產品中屬於最經常使用必備的模塊,在互聯網安全形勢嚴峻的今天,其重要性更是不言而喻。如何處理好這個部分,關係到產品在用戶內心的信譽。關於登陸受權的安全性涉及方方面面,本文重點討論的場景是:當登陸或受權失敗時,應該如何返回給用戶錯誤提示。安全
場景具體描述爲:app
用戶進入登陸頁面,輸入手機號,點擊發送短信驗證碼;用戶收到短信驗證碼後,輸入驗證碼,點擊登陸;校驗信息成功,給予用戶受權,失敗則給予錯誤提示。less
問題1:測試
當用戶輸入手機號後,點擊發送驗證碼時,若是用戶不存在或者不該被受權時,是否應該直接提示錯誤信息,如:用戶不存在,未註冊,手機號已被佔用,已綁定等。spa
問題2:支付寶
當用戶收到短信驗證碼已經超時,輸入過時驗證碼或者沒有點擊發送驗證碼,直接輸入錯誤驗證碼時,是否應該提示:驗證碼無效,驗證碼未發送等。get
綜合的講,就是是否應當在登陸或受權頁面給予用戶詳細的錯誤提示。產品
首先我去看下主流App是如何作的,調研的有:支付寶,京東,微博,中國移動,摩拜,ofo,首先在手機上退出登陸,而後使用短信驗證碼進行登陸,沒有短信登陸的,使用短信找回密碼功能測試。結果是it
問題1:
支付寶,京東,微博將手機號輸入頁面和短信驗證碼頁面分離,而且校驗了用戶手機號是否存在,不存在給予提示。而中國移動,摩拜,ofo,手機號輸入和短信驗證碼在同一頁面,沒有校驗用戶手機號是否存在,而是直接提示短信發送成功。
問題2:
支付寶,京東,微博,中國移動,摩拜,ofo,全部App在短信驗證碼超時或未發送驗證碼時,提示信息不包含驗證碼無效,驗證碼未發送等信息,而只是提示:驗證碼錯誤。錯誤提示與正常狀況下已發送驗證碼且驗證碼在有效期時,用戶輸入錯誤驗證碼的提示相同。
緣由是什麼呢?這麼作的目的是爲何呢?我到OWASP找到了答案。其中兩段描述:
An application should respond with a generic error message regardless of whether the user ID or password was incorrect. It should also give no indication to the status of an existing account.
The correct response does not indicate if the user ID or password is the incorrect parameter and hence inferring a valid user ID.
也就是說登陸受權操做的結果,不該該包含或者隱含帳戶的狀態或者處理邏輯的狀態這些信息,而是應該返回一個統一的錯誤提示,這樣作的目的是爲了儘可能避免受到破解攻擊,攻擊者能夠利用上你返回的任何附加信息,對帳戶進行破解。經過用戶手機號驗證用戶是否存在,會存在泄露用戶隱私及系統帳戶信息的風險,好比攻擊者能夠經過枚舉,查出系統內所有註冊手機號。以上實例是從短信驗證碼角度考慮的,因爲短信驗證碼存在有效期,其實自己安全性仍是較高,當系統使用用戶密碼時,採起的策略就必須更加嚴謹。