Вопрос по asp.net – Предотвратить манипулирование строк запроса, добавив хэш?

1

Чтобы защитить веб-приложение от манипуляций со строкой запроса, я рассматривал возможность добавления параметра строки запроса в каждый URL-адрес, в котором хранится хэш SHA1 всех других параметров строки запроса & amp; значения, затем проверка по хешу на каждый запрос.

Обеспечивает ли этот метод надежную защиту от пользовательских манипуляций со значениями строки запроса? Есть ли другие недостатки / побочные эффекты для этого?

Я не особенно обеспокоен "уродливыми" URL для этого частного веб-приложения. URL-адреса по-прежнему будут "закладками"; поскольку хеш всегда будет одинаковым для одинаковых аргументов строки запроса.

Это приложение ASP.NET.

Почему бы просто не использовать реальную безопасность / аутентификацию? tster

Ваш Ответ

5   ответов
0

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

Я не вижу никаких других проблем по этому поводу. Кто-то может сказать вам, что хеш можно вычислить, но вы можете играть с порядком параметров, получая разные хэши и делая очень трудным угадывание.

8

что это обеспечивает какую-либо безопасность. Если злоумышленник в середине хочет изменить параметры, все, что он должен сделать, это изменить строку запроса, пересчитать хэш SHA-1 и отправить этот запрос на сервер.

Например, URL, отправленный браузером, может быть:

http://www.example.com/addUser.html?parameterA=foo&hash=SHA1(& Quot; = Foo параметр Л & Quot;)

Если злоумышленник перехватит это, он может отредактировать это следующим образом:

http://www.example.com/adduser.html?parameterA=bar&hash=SHA1(& Quot; = бар параметр Л & Quot;)

На самом деле это сводится к тому, что вы можете доверять хешу только столько, сколько самим параметрам.

Один из способов исправить это - если у пользователя есть пароль, который знают только они и сервер, то злоумышленник не сможет пересчитать хеш, если они изменят параметры. Например:

http://www.example.com/addUser.html?parameterA=foo&hash=SHA1(& Quot; = Foo параметр Л & Quot; + & Quot; theuserpassword & Quot;)

Но не указывайте пароль в качестве одного из параметров в URL-адресе :)

Важно отметить, что это не современный уровень техники для проверки целостности сообщений, передаваемых между двумя сторонами. Сегодня используется форма алгоритма кода аутентификации сообщений (HMAC) на основе хеша, которая довольно хорошо описана вHMACи, безусловно, вRFC2104 а такжеFIPS Pub 198-1.

Вы можете просто иметь Соль для Хэша, чтобы предотвратить манипуляции / человек в середине и т. Д.
@novalis, вы правы, что это не современное состояние. Я хотел просто описать концепцию HMAC, не путая обсуждение с дополнением. Чтобы уточнить, я добавил параграф, отмечающий это и ссылающийся на соответствующие публикации RFC и NIST.
Я думаю, что пока соль очень случайная и держится в секрете, это будет приемлемым решением. saille
Если вы имеете в виду соли, которые похожи на соли / etc / passwd, то они не обеспечивают никакой безопасности против MITM-атак. Соли, как правило, общедоступны и служат только для того, чтобы затруднить обращение хэша с помощью атак методом грубой силы. «Соль»; (на самом деле ключ в ключевом хэше) должен быть секретным, чтобы не дать злоумышленнику возможности изменить и пересчитать дайджест. По сути, это схема аутентификации, которая обычно требует каких-то общих секретных знаний.
Дляgreat описание солей и то, как они используются в безопасности, смотрите здесь:stackoverflow.com/questions/1645161/…
0

что javascript должен был бы выполнять вычисления SHA на стороне клиента только для того, чтобы ссылаться на страницы, это, конечно, зависит от того, насколько вы используете JS, но не должно быть ошибочным думать, что аргумент get может включать pageNo = 1, и иметь возможность «перейти на страницу»; поле ввода, это будет затруднено, если вы добавите хеш. Вы можете хранить в сеансе (на стороне сервера) все, чем вы действительно не хотите манипулировать.

2

В файле global.asax

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    // I take the url referer host. (manipulating the query string this value is null or your local address)
    string strRefererHost = Request.UrlReferrer == null ? string.Empty : Request.UrlReferrer.Host;

    // This is the host name of your application 
    string strUrlHost = Request.Url.Host;

    // I read the query string parameters
    string strQSPars = Request.Url.Query ?? string.Empty;

    // If the referer is not the application host (... someone manipulated the qs)...  
    // and    there is a query string parameter (be sure of this otherwise nobody can access the default page of your site
    // because this page has always a local referer...)
    if (strRefererHost != strUrlHost && strQSPars != string.Empty)
        Response.Redirect("~/WrongReferer.aspx"); // your error page

}
Но его очень легко сломать, так как заголовки http отправляются в виде простого текста по сети.
1

еки с открытым исходным кодом:

http://www.codeproject.com/KB/aspnet/Univar.aspx

Он использует уникальный ключ для каждого клиентского компьютера и поставляется со многими другими вкусностями.

Похожие вопросы