0

我正在开发用 Java(JSF 1.2)编写的 WebApplication,我需要实现在新浏览器窗口中打开其他第 3 方 WebApplication(在其他域中)的新功能。我需要使用表单 POST 请求登录到这个第 3 方 WebApplication。我的应用程序中的用户应该只看到一个按钮,该按钮应该让他登录到这个第 3 方 Web 应用程序。问题是,我的 Web 应用程序中的用户无法知道他登录到这个第 3 方系统的凭据。

这是我对这个问题的第一个虚拟解决方案:

我添加了一些 JavaScript 和一个按钮:

<script type='text/javascript'>
  function login(username, password) {
    var action = "https://some.portal.at.other.domain/login.jsp";
    var data = "";
    data = data + "<form name='loginform' action='" + action + "' method='post'>";
    data = data + "  <input id='username' name='username' type='hidden' value='" + username + "' />";
    data = data + "  <input id='password' name='password' type='hidden' value='" + password + "' />";
    data = data + "</form>";
    data = data + "<sc" + "ript type='text/javascript'>";
    data = data + "  document.loginform.submit();";
    data = data + "</sc" + "ript>";
    newWindow=window.open("", "_blank");
    newWindow.document.write(data);
    newWindow.document.close();
  }
</script>

...

<a4j:commandButton id="Login"
                   value="Login"
                   onclick="login('#{user.login}', '#{user.password}')"/> 

这就像一个魅力,但是......当我在浏览器中查看 html 源代码时,我可以看到:

<input id="form:Login" name="form:Login" onclick="login('john', 'secret')" value="Login" type="button" />

因为 JSF 在渲染页面时评估 #{user.login} 和 #{user.password} ,所以安全性被破坏了:)

我的问题是:是否有可能以任何方式保护此功能?

我知道如果有人有像 FireBug 或 WireShark 这样的工具,那么他可以很容易地看到这个 POST 请求,所以我觉得这通常不能得到保护。我想以某种方式确保这一点,它需要更多的努力来打破,而不是仅仅查看页面源。

我认为我应该这样做:在 onclick 上执行一些 ajax 请求,该请求将返回在服务器端生成的这个 JavaScript,然后评估这个 JavaScript,但我不知道该怎么做。

所以请大家给我一些建议谢谢

4

1 回答 1

2

保护此类进程的唯一方法是在服务器端执行它。也就是说:如果登录发生在客户端,您必须假设客户端对登录中使用的所有凭据具有完全访问权限。

处理这种需要客户端请求但必须首先进行秘密登录的情况的标准方法是让登录发生在服务器端,在用户背后,并返回一个令牌客户端可以用来授权他们绝对允许提出的特定请求。

于 2012-09-12T16:11:09.280 回答