2008-10-29 2 views
5

Как вы должным образом гарантируете, что пользователь не вмешивается в значения запроса или значения URL-адреса действия? Например, у вас может быть действие «Удалить комментарий» на вашем CommentController, которое принимает идентификатор CommentID. URL-адрес действия может выглядеть как/Comments/Delete/3 для удаления комментария с идентификатором 3.Безопасность с значениями QueryString в Asp.net MVC

Теперь, очевидно, вы не хотите, чтобы кто-либо мог удалять комментарий 3. Обычно у владельца комментария или администратора есть разрешение на это. Я видел, что эта безопасность применялась разными способами и хотела бы знать, как некоторые из вас это делают.

Вы делаете несколько вызовов базы данных для извлечения комментария и проверяете, соответствует ли автор комментария пользователю, вызывающему действие удаления?

Передайте ли вы идентификатор CommentID и идентификатор пользователя до хранимой процедуры, который выполняет удаление, и выполните удаление, в котором UserID и CommentID равны значениям, переданным в?

Лучше ли шифровать значения строки запроса?

ответ

18

У вас нет.

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

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

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

0

я сделал фанки вещи берут строку запроса, сжать его, Base64 или просто шестигранной кодировать его, так что «CommentID = Идентификатор_пользователя = 12345» становится «код = 1a2b23de12769»

Это в основном «Безопасность через безвестность ", но он действительно много работает для тех, кто пытается взломать сайт.

0

Вы не можете легко сделать это.

У меня есть приятные воспоминания о сайте, который использовал ссылки на действия для удаления.

Все было хорошо, пока они не начали поиск в интрасети.

Ooops, до свидания данные.

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

+0

Тогда как вы предлагаете мне редактировать/удалять вещи тогда? Имейте в виду, что я использую Asp.net MVC – Vyrotek 2008-10-29 03:02:45

+0

. Перед выполнением удаления вы должны отправить POSTing своим методам контроллера, чтобы вызывать удаление - и проверку учетных данных запроса (cookie/username/password/whatever). См. Сообщение @ Schotime. – 2008-12-19 00:30:11

1

Вы также можете разрешать только сообщения «Посты» для удаления действия контроллера, используя атрибут «Принять глаголы», как показано ниже.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Delete(int? id) 
{ 
    //Delete 
} 

Тогда вы могли бы также использовать маркер antiforgery, как описано здесь:

http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

3

Vyrotek: Метод ввода не важен. GET, POST, зашифрованный/запутанный GET - нет реальной разницы.Независимо от того, как ваше приложение получает команды, чтобы выполнить административное действие, оно должно удостовериться, что выдающему пользователю разрешено делать то, что он хочет. Проверка разрешения должна выполняться ПОСЛЕ получения команды и до того, как она будет выполнена. В противном случае это не безопасность.

6

Enrypting и дешифрование параметров запроса тривиальный процесс, и есть некоторые большие примеры того, как сделать так, используя HttpModule здесь, на StackOverflow.

«Вы не делать», «Вы не можете», или «Это не просто» просто не приемлемые ответы в этот день и возраст ...

Смежные вопросы