在我的网站上,我有一些jquery正在从登录表单向我的API发出发布请求。这是jquery:
function doLogin()
{
var userEmail = $("#email").val();
var userPassword = $("#password").val();
$.post(
"https://api.linkenfest.co.uk/access/login/<?= $referrer ?>",
{
email: userEmail,
password: userPassword
}
).done(function( data ){
var status = data.data.status;
var referrer = data.data.referrer;
var message = data.data.message;
var session = data.data.session;
alert( message );
if( status == 200 ){
window.location.replace( referrer + "?session=" + session );
}
}
);
返回成功后,我的api响应如下:
{
"status": 200,
"data":{
"status": 200,
"referrer": "page.php",
"message": "Successful login",
"session": "o3vo1uram0k2mojmbd45pmicr2"
}
}
从我的回复中可以看到,它包括从php session_id()
获得的值
我想知道向用户提供此信息是否会打开网站上的安全漏洞。
会话ID值用于在window.location.reload
之后启动会话
谢谢。
答案 0 :(得分:0)
正如其他人在评论中已经指出的那样,获得会话ID的客户端是管理会话的标准方法-在随后的请求中还可以如何发送它?但是客户端如何接收它确实很重要。
请注意,上面的代码很容易受到攻击。
"https://api.linkenfest.co.uk/access/login/<?= $referrer ?>"
-如果$ referrer是请求中的Referer标头,则这反映为XSS。在Java上下文中,仅进行html编码是不够的,您需要javascript编码。
window.location.replace( referrer + "?session=" + session )
-从技术上讲,这是对Referrer参数的开放重定向。但是,利用它并不容易。最佳实践仍然是对其进行验证(最好在服务器上-可能已经安装了)。
会话管理薄弱,会话ID可用于Javascript。尽管在某些情况下这是可以接受的,但是接受这种风险应该是一个有意识的决定。会话ID通常(传统上)应在httpOnly cookie中设置。无法做到这一点的一个例外是需要将令牌发送到其他来源。但是在这种情况下,从语义上来说这不是会话ID,因此应该有适当的SSO解决方案。
会话ID是敏感信息,因此,不应在url中发送。 url的问题在于它被记录在多个位置(用户的浏览器会记住它并将其保存到磁盘,它将被记录在中间代理以及目标服务器的日志中。这些都是攻击者可能从中获取的位置最好不要在url中发送敏感信息,而应该在标头(cookie也是标头)中发送,或者在需要时也可以发送请求正文。
目标网址(api.linkenfest.co.uk)如果允许您以这种方式登录,则很容易登录csrf。
还要从更广阔的角度看待这个问题,我想您正在使用api作为身份提供者来登录您的用户。为此,您应该使用标准协议(例如OpenID Connect),而不要重蹈覆辙,因为正如您在上面看到的那样,它一点也不简单。