我只想从服务器的内部进程发送消息,然后发送到客户端,并且由于 SignalR 的灵活性,我担心 XSS 可以轻松发送消息“myhub.addMessage”并发送我不想广播的垃圾。例如,我有 50 个人在一个页面上侦听来自 SignalR Hub 的消息。他们没有明确的方式通过 GUI 发送消息,但是,一个笨手笨脚的人可以轻松地破解一些脚本并开始发送消息以供所有人查看。
换句话说,它有点像拥有一个聊天室,但你想阻止人们发送消息。你只希望他们听到。说得通?
从 Hub 中删除 AddMessage 方法。
就是这样。
如果您仍然需要来自网络的功能,那么您将需要设置某种安全性来进行检查。SingalR 还没有内置这个。
或者,如果您只需要从网络外部(例如服务器只是发布事件),那么集线器的外部方法就可以了(请参阅页面底部的从集线器外部通过集线器广播:https:// github.com/SignalR/SignalR/wiki/Hubs)
另一种选择是在任何给定操作开始时检查身份验证。您确实可以访问 cookie。但我不确定正常的会员系统,因为我不使用它。由于您可以访问 cookie,因此这是我用于身份验证的模式:
public SomeHub : Hub
{
public void RandomAction()
{
if(!CheckCookie("Role Required"))
{
//In here we have what happens when there is
// a cookie that is associated with the right Role Required
}
}
}
您也许可以在 CheckCookie 中使用会员系统,但这可能会有所帮助:
string CookieName = "Website Authentication";
string vReturn = null;
HttpCookie vCookie = null;
if(HttpContext.Current.Request.Cookies.AllKeys.Any(t => t == CookieName))
vCookie = HttpContext.Current.Request.Cookies[CookieName];
if(vCookie != null)
vReturn = FormsAuthentication.Decrypt(vCookie.Value).Name;
return vReturn;
会员cookie名称不是那个,它只是一个填充物。