2015-12-04 2 views
2

Я хотел бы знать возможные риски наличия формы с атрибутом действия в среде asp.net mvc?Каков риск атрибута действия формы в asp net mvc?

Например, a create view имеет < form action = "/ Person/Create" ...> на разметке html.

Может ли кто-нибудь отправить сообщение в mydomain.com/Person/Create с помощью скрипача (например)?

Это очень похоже на сценарии Jquery ajax. Имя сообщения или имени метода отображается на html-значке вверх. Everbody может видеть исходный код html моей страницы. Это означает, что когда-нибудь можно увидеть имя моих действий.

Как я могу получить безопасный подход к этой проблеме?

Вне курса Я могу иметь атрибуты Bind на действии httppost. Но Мое желание состоит в том, чтобы сделать имена моих действий секретом или иметь идею лучшей практики. (Если возможно)

Спасибо за все.

+0

Это не связано с ASP.NET MVC или jQuery. Где-то на клиенте вы должны хранить, куда будете отправлять свои данные. Вы можете попытаться замаскировать его, скрыть его, запутать его, но в конце концов он должен прийти от клиента и клиента, который вам доступен. – CrnaStena

+1

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

ответ

1

Не скрывайте свои действия.

Избегайте несанкционированного доступа, выполняя, ну, авторизацию.

Предотвращение манипулирования уполномоченными лицами от необоснованных действий (например, атак XSRF) с помощью токенов подпрограммы-подлога (как в ответе Stunt Double от Moby's Stunt Double).

+0

все в порядке, что, если авторизованный пользователь делает сообщение от fiddler за 100000 (или более) раз в одно из моих действий? – oneNiceFriend

+3

@oneNiceFriend, что означает, что вы позволили ему это сделать (он санкционирован). если авторизованные люди подвержены ограничениям, вы должны применять эти ограничения (например, 1 раз в минуту и ​​т. д.). –

1

Theres не нужно скрывать эту информацию, вы хотите, чтобы клиентская сторона узнала, куда отправлять данные. Как они это делают, это зависит не от вас, от браузера, Fiddler или от другой клиентской программы. Более важно то, что действия, которые являются результатом этого GET или POST, являются безопасными. Привязать атрибуты, например. защитите вас от перенапряжения.

Emilio's решение скрывает ваши имена действий, что является крутым для лучшей читаемости URL-адресов, но не делает его более безопасным, поскольку теперь злоумышленник увидит публичные имена, и в любом случае они будут перенаправлены на ваше действие.

4

Вы не можете скрывать свои действия, но в этом отношении вы можете выполнить рудиментарную политику безопасности, используя встроенные антивианные токены ASP.NET. https://msdn.microsoft.com/en-us/library/dd470175(v=vs.118).aspx

В вашей форме, поместите маркер со встроенным в HTML Helper:

@Html.AntiForgeryToken() 

Тогда на ваши действия, поместите соответствующий атрибут:

[ValidateAntiForgeryToken] 
[HttpPost] 
[Authorize] 
public ActionResult Edit() 

Теперь вы не должны быть в состоянии имитировать запрос POST против действий вашего контроллера.

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

+0

Это работает только против атак XSRF. Это не мешает человеку ПОЧТИ запрашивать одно и то же действие. Кто-то еще может извлечь токен подделки из файла cookie, отправить запрос POST с помощью токена, вы знаете, как и сам пользователь. Чтобы защитить действия, совершаемые с неизвестными людьми, необходимо выполнить соответствующую авторизацию. –

+1

Я всегда поощряю использование обоих, Sedat. Любая маленькая вещь (и небольшая вещь, я имею в виду токены CSRF, как указано выше, а не авторизацию запросов), мы можем сделать, чтобы сделать жизнь трудной для будущих крекеров. –

1

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

public class ProductsController { 

    [ActionName("PublicName")] 
    public ActionResult SecretName() { 
     return View(); 
    } 

} 

URL-адрес для навигации от клиента будет http://yoursite/Products/PublicName вместо http://yoursite/Product/SecretName

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