我正在开发用Java编写的WebApplication(JSF 1.2),我需要实现在新浏览器窗口中打开其他第三方WebApplication(在其他域中)的新功能。 我需要使用表单POST请求登录到第三方WebApplication。 我的应用程序中的用户应该只看到一个按钮,该按钮应该将他登录到第三方Web应用程序。 问题是,我的Web应用程序中的用户无法知道他登录此第三方系统的凭据。
这是我对这个问题的第一个虚拟解决方案:
我添加了一些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,但我不确切知道如何执行此操作。
所以请各位给我一些建议 感谢
答案 0 :(得分:2)
保护此类过程的唯一方法是在服务器端执行它。即:如果登录发生在客户端,则必须假设客户端可以完全访问登录中使用的所有凭据。
处理此类情况的标准方法,其中需要客户端请求,但必须首先进行秘密登录,是在服务器端进行登录,在用户后面进行登录,然后返回令牌,客户可以使用它来授权他们绝对允许的特定请求。