В данном уроке создадим страницы, которые будут уязвимы для SQL инъекций и проверим работоспособность теории, которую мы прочитали в предыдущем уроке, а в следующем уроке попробуем защитить наши страницы от подобных атак.
Создадим страницу авторизации. На ней расположим два текстовых поля и кнопку войти. При нажатии на кнопку войти у нас должен запускаться скрипт, который будет проверять имя и пароль в базе данных. Для реализации данной страницы создадим следующую разметку:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<table>
<tr>
<td>Login</td>
<td><asp:TextBox ID="tbLogin" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td>Password</td>
<td><asp:TextBox ID="tbPassword" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td>
<asp:Button ID="btnLogin" runat="server" Text="Login" onclick="btnLogin_Click" />
</td>
<td>
<asp:Label ID="lblInfo" runat="server" Text="Label"></asp:Label>
</td>
</tr>
</table>
|
Вот как она будет выглядеть:

Label на данной странице используется для того, чтобы узнать смог ли авторизоваться пользователей. Если да, то она показывает true, если нет, то она показывает false.
Как мы и говорили до этого, проверка имени и пароля в базе данных будут осуществляться с помощью следующего sql запроса:
|
1
|
SELECT * FROM Users WHERE Name = 'name' AND Password = 'password'
|
Теперь если запрос вернет нам больше нуля записей, то мы говорим, что пользователь прошел авторизацию. При создании запроса мы конечно должны допустить ошибку и произвести конкатенацию строк.
Поместим на страницу следующий код:
|
1
2
3
4
5
6
7
8
9
|
protected void btnLogin_Click(object sender, EventArgs e)
{
string connectionString = WebConfigurationManager.ConnectionStrings["ourBase"].ConnectionString;
SqlConnection con = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand("SELECT * FROM Users WHERE Name = '"+tbLogin.Text+"' AND Password = '"+tbPassword.Text+"'", con);
con.Open();
SqlDataReader reader = command.ExecuteReader();
lblInfo.Text = reader.Read().ToString();
}
|
Проверим этот код на уязвимость. Попробуем вместо имени написать ‘ OR 1 = 1—
SQL инъекция сработала и неизвестный злоумышленник проник в нашу систему.(Конечно же в нашей базе данных должны быть какие — то записи, а то никто не сможет проникнуть в столь неприступную систему, если не добавит туда своих записей)
Следующая страница будет заниматься тем, что выводит информацию об одной новости. В качестве параметра она принимает id записи. Для реализации данной страницы нам достаточно будет один label, который будет выводить новость, в случае, если такая новость есть и нет данных в противном случае.
|
1
|
<asp:Label ID="lblInfo" runat="server" Text="Label"></asp:Label>
|

Код страницы:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
protected void Page_Load(object sender, EventArgs e)
{
String ID = Request.QueryString["id"];
if (ID == null)
{
ID = "0";
}
string connectionString = WebConfigurationManager.ConnectionStrings["ourBase"].ConnectionString;
SqlConnection con = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand("SELECT * FROM News WHERE ID =" + ID , con);
con.Open();
SqlDataReader reader = command.ExecuteReader();
if (reader.Read())
{
lblInfo.Text = reader.GetInt32(0).ToString() + reader.GetString(1) + reader.GetString(2);
}
else
{
lblInfo.Text = "Нет данных";
}
}
|
|