Javascript 在HTML中显示凭据的安全含义

Javascript 在HTML中显示凭据的安全含义,javascript,php,html,security,authentication,Javascript,Php,Html,Security,Authentication,我目前正在为一个私人项目开发一个java后端和一个前端,使用php、html和javascript(但我最终希望开源),这意味着访问受限于我的局域网,安全性目前并没有起到至关重要的作用,但将来可能会起到作用 由于我最熟悉用java编码,大多数数据处理和存储(MySQL)都是用java处理的,并通过http提供给前端(javascript;fetch()) 另外,这个java后端处理身份验证过程,这意味着我必须通过javascript中的fetch调用将登录凭证传递到后端 由于我对高级web编程并

我目前正在为一个私人项目开发一个java后端和一个前端,使用php、html和javascript(但我最终希望开源),这意味着访问受限于我的局域网,安全性目前并没有起到至关重要的作用,但将来可能会起到作用

由于我最熟悉用java编码,大多数数据处理和存储(MySQL)都是用java处理的,并通过http提供给前端(javascript;fetch())

另外,这个java后端处理身份验证过程,这意味着我必须通过javascript中的fetch调用将登录凭证传递到后端

由于我对高级web编程并不感兴趣,我认为登录的基本POST->REDIRECT->GET设置就足够了,我以前也使用过类似的登录过程(但在PHP中处理身份验证)。因此:

  • 客户端填写HTML表单并提交
  • 浏览器向/login发出POST请求,传递凭证和目标页面
  • 然后,PHP返回包含javascript部分的HTML,该部分以纯文本形式保存凭证
    登录(“,”,”)
  • Javascript然后使用这些凭证获取java后端,以创建会话
  • Javascript问题
    window.location.replace(目标)
    和客户端被重定向到目标页面(其中通过会话cookie处理身份验证)
  • 如果从效率和安全的角度来看这是个好主意的话,我现在想得太多了。我目前的想法是使用表单直接使用javascript将数据提取到后端,而不是使用附加页面的POST请求(跳过上面的步骤2和步骤3):

    这意味着首先PHP永远不会看到凭证(这将减少一个失败点),凭证可能不会显示在HTML中。此外,这将减少加载时间,因为不再需要POST

    因此,我的问题是:

  • 在HTML中显示凭据(就像在URL中显示凭据一样,以防止用户在复制URL时意外地将凭据发送给他人)是否是一种不好的安全做法?与此相关的风险有哪些?这些凭证可以被使用的任何JS库或浏览器扩展读取吗?如果是这样的话,这些人可能还可以读取我在表单中键入的凭据
  • 从安全角度(和效率角度)来看,我的替代设置是否更好
  • 在这种情况下,是否还有其他改进安全性的建议

  • 谢谢你的帮助。

    这篇文章和下面讨论的简短摘要:

    通过首先将凭据发布到PHP,然后在返回的HTML中将它们返回给客户端,延迟(由于额外的页面负载)增加,PHP被添加为另一个故障点
    ,理论上系统会面临更多的安全问题
    (即,通过javascript或浏览器扩展扫描代码或入侵PHP服务器)

    因此,有两种解决方案是可行的:

  • 完全跳过PHP,让登录仅由javascriptjava后端处理(以下第1-5点详细介绍了此过程;这仅在PHP服务器不需要此特定用例中的身份验证信息时才有可能)
  • 将凭据发布到PHP,并让PHP与负责身份验证的java后端进行通信,而不是将其保留给客户端
  • 原创帖子:

    我不太明白为什么你认为PHP后端不可信,但在你的方案中,PHP已经获得了你的凭据,这要感谢那篇原始文章。如果你想避免使用PHP,为什么不让你的表单调用javacccript函数,而不是一开始就发布到PHP后端:

  • 用户输入凭据
  • 用户单击“登录”
  • JavaScript拦截登录尝试,调用login()
  • JavaScript获取
    用户,从文档体传递
    getElementById(…)
  • JavaScript联系处理登录的Java后端
  • 不需要PHP。但我可能想知道为什么这是必要的——如果你不能信任你自己的后端,你的安全实践是什么?如果你的PHP不能被信任,为什么你的Java会更好

    在您的方案中,您已经在POST请求中将凭据传递到PHP后端。如果您担心的是PHP不知道凭据,那么您已经失败了

    至于效率,您的方案有额外的页面负载,这将使用带宽,最大化延迟(与最小化延迟的目标相反),并使您在注意到额外重定向的用户面前显得无能。JavaScript听起来更好的解决方案是您想用Java编写数据库代码

    至于HTML中出现的凭据,实际上没有什么区别,因为唯一可以访问它们的人是用户(已经输入了凭据)。如果他们输入了错误的凭据,他们只会看到错误的凭据。也就是说,这违反了最佳做法,可能不是一个好主意

  • 在HTML中显示凭据(就像在URL中显示凭据一样,以防止用户在复制URL时意外地将凭据发送给他人)是否是一种不好的安全做法?与此相关的风险是什么?任何JS-l都可以读取这些凭据吗