Бездарний policy asp. Зберігання рядка підключення до бази даних

Назавжди з role-based and claim based authorization, ASP.NET Core також supports the policy-based authorization. Policy is nothing but a collection of requirements with different data parametrs to evaluate the user Identity. Більше про policy-based authorization . Цей короткий запуск показує, як реалізувати єдину authorization policy в ASP.NET Core 2.0 application. Один здійснений, policy стає глобальною і придатною до всього застосування.

Для implementing single authorization policy, Open Startup.cs і встановіть наступні коди в ConfigureServices метод для забезпечення authorization for all the controllers (be it MVC or API).

Public void ConfigureServices(IServiceCollection services) ( services.AddMvc(o => ( var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); o.Filters.Add() AuthorizeFilter(policy))

Цей код обов'язків, що кожна сторінка буде потрібна authentication як policy will demand the user to be authenticated. Тільки ці дії були зафіксовані і можуть бути використані.

Попередній код блоку буде досягнуто authorization for all the environments (Development, staging or production). However, ви не будете той самий behavior в розвитку навколишнього середовища як це може призвести до тестування ефектів. Це повинно бути відповідним для розповсюдження розвитку навколишнього середовища. Для того, щоб exclude development environment, we need to check for the environment and write code accordingly. Для того, щоб змінити ConfigureServices method to IHostingEnvironment service and check for the development environment. Як:

Public void ConfigureServices(IServiceCollection services, IHostingEnvironment env) ( if (!env.IsDevelopment()) ( services.AddMvc(o =>

Застосовувати зміни та керування цим пристроєм. And you should be surprised to see following exception message в the browser.

“The ConfigureServices method must either be parameterless or take only only parameter of type IServiceCollection.”

Message clearly says, ConfigureServices method either should be with no parameters or with only one parameter. Therefore, we can't directly inject the IHostingEnvironment в the ConfigureServices метод. The, the question is how do we make it available in the ConfigureServices method?

Well, ми можемо включити IHostingEnvironment service в Startup class constructor і store it in a variable. Існує Startup class constructor, створюючи IConfigurationRoot, використовуючи ConfigurationBuilder і дає змогу до property on Startup called Configuration . Ви можете скористатися тим самим рішенням для IHostingEnvironment, щоб забезпечити його якість на Startup, для використання останніх в ConfigureServices . The Startup class constructor would look something like this:

Public Startup (IConfiguration configuration, IHostingEnvironment env) ( Configuration = configuration; HostingEnvironment = env; ) Public IConfiguration Configuration ( get; ) public IHostingEnvironment

Далі, ми можемо використовувати HostingEnvironment variable в ConfigureServices метод для перевірки навколишнього середовища. We'll enable the authorization тільки для навколишнього середовища інших для розвитку.

Public void ConfigureServices(IServiceCollection services) ( if (!HostingEnvironment.IsDevelopment()) ( services.AddMvc(o => ( var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build()); (policy)); ));) else services.AddMvc();

Bonus Tip:Якщо ви скористаєтеся використанням будь-якого JWT або OAuth authentication for your application and wish to disable authentication in development environment, then use the following code in ConfigureServices method.

If (HostingEnvironment.IsDevelopment()) ( services.AddMvc(opts => ( opts.Filters.Add(new AllowAnonymousFilter()); )); ) else ( services.AddMvc(); )

Для сумісності, технологія показує Help, щоб реалізувати тільки authorization policy Global in ASP.NET Core 2.0 apps. Ви можете легко задовольнити це тільки для охолодження або продуктивності навколишнього середовища.

Thank you for reading. Keep visiting цей blog і share this in your network. Please put your thoughts and feedback in the comments section.

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



Примітка: ми продовжуємо серію публікацій повних версій статей із журналу Хакер. Орфографія та пунктуація автора збережені.



Я думаю зі мною погодиться багато хто, що ASP.NET MVC це стек досить популярних технологій. Хоча технологія давно не на піку хайпа, але попит на .NET-івських веб-розробників досить високий.


Разом з тим, під час розробки обов'язково слід враховувати аспекти безпеки. Хоч якийсь функціонал і рятує від класичних всім відомих атак, але від досить великої кількості трюків хакерів потрібен додатковий захист. Давайте розглянемо найпопулярніші види атак та способи захисту. Must know для ASP.NET розробника (чи то Core, MVC, MVC Razor або WebForms).


Почнемо з усіх відомих видів атак.

SQL Injection

Як не дивно, але в 2017 році Injection і зокрема SQL Injection знаходиться на першому місці серед Top-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.AddWithValue("@ID", customerID);

Якщо ви розробляєте MVC додаток, Entity Framework прикриває деякі вразливості. Для того, щоб у MVC/EF додатку спрацювала SQL ін'єкція, потрібно примудритися. Однак це можливо, якщо ви виконуєте SQL код за допомогою ExecuteQuery або викликаєте погано написані процедури, що зберігаються.


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


public string Zip (get; set;)

У WebForms обмежити можливі значення можна за допомогою валідаторів. Приклад:



Починаючи з .NET 4.5 WebForms використовують Unobtrusive Validation. А це означає, що не потрібно написання якогось додаткового коду для перевірки значення форми.


Валідація даних зокрема допоможе захиститися від ще однієї відомої вразливості під назвою Cross-Site Scripting (XSS).

XSS

Типовий приклад XSS – додавання скрипта у коментар чи запис у гостьову книгу. Наприклад, такого:



Як ви розумієте, в даному прикладі куки з вашого сайту передають як параметр на якийсь хакерський сайт.


У Web Forms можна зробити помилку за допомогою приблизно такого коду:


Вибачте<%= username %>, але пароль помилковий


Зрозуміло, що замість username може бути скрипт. Щоб уникнути виконання скрипту, можна як мінімум використовувати інший ASP.NET вираз:<%: username %>, що енкодить свій вміст.


Якщо ви використовуєте Razor, рядки автоматично еккодуються. Так щоб отримати XSS потрібно постаратися і зробити помилку. Наприклад, використовувати .Raw(Model.username). Або у вашій моделі використовувати MvcHtmlString замість string


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


Наступний приклад поверне рядок "