当前位置:   article > 正文

OpenWrt系统安全改进<三> --- Web UI密码错误控制_openwrt密码错误次数

openwrt密码错误次数
OpenWrt系统安全改进<>中所做的尝试,是为了增强用户登录的鉴权机制(密码输错三次就禁用用户一段时间),PAM可以实现对用户登录的控制,但是进一步操作中发现WebUI的登录并没有支持PAM,前功尽弃......
了解了一下OpenWrt的luci机制,参见http://www.360doc.com/content/14/0312/20/1964482_360072189.shtml,简单来说,就是使用uhttpd来解析http报文,一些具体的操作都由lua来实现。
本来是想修改uhttpd来实现这个功能,但是抓包看了一下,uhttpd并不关心luc程序的操作结果,虽然能够识别到用户登录,但是要获取密码认证结果却并不方便,于是只好硬着头皮上lua。
 
下面是最基本的实现,多用户,信息安全都没有考虑,以后可以改进一下。
另外,密码输错三次后,用户继续输入,返回在web页面的信息还是密码错误而不是用户被限制,也需要修改。

 

  1. FORBIDEN_EXPIRE = 180
  2. MAX_TRY = 3
  3. local UserErrorCount = 0
  4. local UserForbidenTime = 0
  5. function writeErrCount(username,count)
  6. os.execute("echo %s > /var/ErrCount" % count)
  7. end
  8. function readErrCount(username)
  9. if fs.access("/var/ErrCount") then
  10. return (tonumber(fs.readfile("/var/ErrCount")))
  11. else
  12. return 0
  13. end
  14. end
  15. function writeForbidenTime(username,ftime)
  16. os.execute("echo %s > /var/ForbidenTime" % ftime)
  17. end
  18. function readForbidenTime(username)
  19. if fs.access("/var/ForbidenTime") then
  20. return (tonumber(fs.readfile("/var/ForbidenTime")))
  21. else
  22. return 0
  23. end
  24. end
  25. function fnsrDbg(string)
  26. os.execute("echo %s >> /luaDbg" % string)
  27. end
  28. function isForbidenExpired(username)
  29. curTime = uptime()
  30. UserForbidenTime = readForbidenTime(username)
  31. if curTime - UserForbidenTime > FORBIDEN_EXPIRE then
  32. fnsrDbg("Forbiden Expired")
  33. return true
  34. else
  35. fnsrDbg("Forbiden Not Expired")
  36. return false
  37. end
  38. end
  39. function isAllowed(username)
  40. if readForbidenTime(username) == 0 then
  41. fnsrDbg("UserAllowed")
  42. return true
  43. else
  44. if isForbidenExpired(username) then
  45. writeForbidenTime(username,0)
  46. fnsrDbg("UserAllowed After ForbidenExpired")
  47. return true
  48. end
  49. end
  50. fnsrDbg("User Not Allowed")
  51. return false
  52. end
  53. function updateAllowed(username,validate)
  54. if validate then
  55. writeErrCount(username,0)
  56. else
  57. UserErrorCount = readErrCount(username)
  58. UserErrorCount = UserErrorCount + 1
  59. writeErrCount(username,UserErrorCount)
  60. if UserErrorCount == MAX_TRY then
  61. UserAllowed = false
  62. writeErrCount(username,0)
  63. writeForbidenTime(username,uptime())
  64. end
  65. end
  66. end

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/290752
推荐阅读
相关标签
  

闽ICP备14008679号