Как сделать просмотр только для чтения в SignalR - PullRequest
0 голосов
/ 27 декабря 2011

Я хочу отправлять сообщения только из внутреннего процесса с сервера, затем исходить к клиентам, и из-за гибкости SignalR, я боюсь, что XSS может легко отправить сообщение "myhub.addMessage" и отправить в мусор, что я хочу транслировать. Например, у меня на странице 50 человек, которые слушают сообщения из SignalR Hub. У них нет явного способа отправки сообщения через графический интерфейс, однако недоумок может легко взломать какой-нибудь сценарий и начать отправлять сообщения для всеобщего обозрения.

Это похоже на чат, другими словами, но вы хотите запретить людям отправлять сообщения. Вы только хотите, чтобы они услышали. Имеет смысл?

1 Ответ

2 голосов
/ 29 декабря 2011

Удалите метод AddMessage из концентратора.

Это действительно так.

Если вам по-прежнему нужна функциональность из Интернета, то вам нужно будет установить какую-то защиту для проверки. SingalR еще не имеет этого встроенного.

Или, если вам это нужно только из-за пределов Интернета (скажем, сервер просто публикует события), тогда методы внешнего концентратора подойдут вам (см. Трансляция через концентратор за пределами концентратора внизу страницы: 1007 *https://github.com/SignalR/SignalR/wiki/Hubs)

Другой вариант - проверить аутентификацию в начале любого действия. У вас есть доступ к куки. Но я не уверен насчет нормальной системы членства, так как не пользуюсь ею. Поскольку у вас есть доступ к файлам 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 членства не таково, это просто наполнитель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...