Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«19 смСртных Π³Ρ€Π΅Ρ…ΠΎΠ², ΡƒΠ³Ρ€ΠΎΠΆΠ°ΡŽΡ‰ΠΈΡ… бСзопасности ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 14

Автор Дэвид Π›Π΅Π±Π»Π°Π½ΠΊ

}

} catch (SqlException e) {

// Ой!

}

Π“Ρ€Π΅Ρ…ΠΎΠ²Π½ΠΎΡΡ‚ΡŒ PHP

Π’ΠΎΡ‚ Ρ‚Π° ΠΆΠ΅ классичСская ошибка, Π½ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° языкС РНР, часто примСняСмом для доступа ΠΊ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ….

...

<?php

$db = mysql_connect("localhost","root","$$sshhh...!");

mysql_select_db("Shipping",$db);

$id = $HTTP_GET_VARS["id"];

$qry = "SELECT ccnum FROM cust WHERE id = %$id%";

$result = mysql_query($qry,$db);

if ($result) {

echo mysql_result($result,0,"ccnum");

} else {

echo "No result! " . mysql_error();

}

?>

Π“Ρ€Π΅Ρ…ΠΎΠ²Π½ΠΎΡΡ‚ΡŒ Perl/CGI

И снова Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π΄Π΅Ρ„Π΅ΠΊΡ‚, Π½ΠΎ Π½Π° этот Ρ€Π°Π· Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° достопочтСнном Perl:

...

#!/usr/bin/perl

use DBI;

use CGI;

print CGI::header();

$cgi = new CGI;

$id = $cgi->param(\'id\');

$dbh = DBI->connect(\'DBI:mysql:Shipping:localhost\',

\'root\',

\'$3cre+\')

or print "Ошибка connect : $DBI::errstr";

$sql = "SELECT ccnum FROM cust WHERE id = " . $id;

$sth = $dbh->prepare($sql)

or print "Ошибка prepare : $DBI::errstr";

$sth->execute()

or print "Ошибка execute : $DBI::errstr";

# ВывСсти Π΄Π°Π½Π½Ρ‹Π΅

while (@row = $sth->fetchrow_array ) {

print "@row<br>";

}

$dbh->disconnect; print "</body></html>";

exit;

Π“Ρ€Π΅Ρ…ΠΎΠ²Π½ΠΎΡΡ‚ΡŒ Java

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ распространСнный язык, Java. ΠŸΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΡŽ SQL ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΆΠ΅ схСмС.

...

import java.*;

import java.sql.*;

...

public static boolean doQuery(String Id) {

Connection con = null;

try

{

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

con = DriverManager.getConnection("jdbc:microsoft:sqlserver: " +

                                           "//localhost:1433", "sa", "$3cre+");

Statement st = con.createStatement();

ResultSet rs = st.executeQuery("SELECT ccnum FROM cust WHERE id=" +

                                   Id);

while (rx.next()) {

// ΠŸΠΎΠ»ΡŽΠ±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ запроса

}

rs.close();

st.close();

}

catch (SQLException e)

{

// Ой!

return false;

}

catch (ClassNotFoundException e)

{

// НС найдСн класс

return false;

}

finally

{

try

{

con.close();

} catch(SQLException e) {}

}

return true;

}

Π“Ρ€Π΅Ρ…ΠΎΠ²Π½ΠΎΡΡ‚ΡŒ SQL

ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ встрСчаСтся Π½Π΅ Ρ‚Π°ΠΊ часто, Π½ΠΎ Π°Π²Ρ‚ΠΎΡ€ ΠΏΠ°Ρ€Ρƒ Ρ€Π°Π· наталкивался Π½Π° Π½Π΅Π³ΠΎ Π² ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½Ρ‹Ρ… систСмах. Показанная Π½ΠΈΠΆΠ΅ хранимая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° просто ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ строку Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ исполняСт Π΅Π΅!...

CREATE PROCEDURE dbo.doQuery(@query nchar(128))

AS

exec(@query)

RETURN

А Π²ΠΎΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ распространСн ΠΊΡƒΠ΄Π° ΡˆΠΈΡ€Π΅ ΠΈ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ опасСн:

...

CREATE PROCEDURE dbo.doQuery(@id nchar(128))

AS

DECLARE @query nchar(256)

SELECT @query = \'select ccnum from cust where id = \'\'\' + @id + \'\'\'\'

EXEC @query

RETURN

Π—Π΄Π΅ΡΡŒ опасная конкатСнация строк выполняСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π²Ρ‹ по–прСТнСму ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚Π΅ постыдный Π³Ρ€Π΅Ρ…, Π΄Π°ΠΆΠ΅ Ссли ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π²Ρ‹Π·Π²Π°Π½Π° ΠΈΠ· ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° языкС высокого уровня.

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΏΠΎΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ Π² SQL, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Β«+Β» ΠΈ Β«||Β», Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CONCAT() ΠΈ CONCATENATE().

Π’ΠΎ всСх этих ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Id. Π’Π°ΠΆΠ½ΠΎ всСгда ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ сСбС, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ, это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π΅ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Π°Ρ ошибка ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Ρ‚ΡŒ любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Id, ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π² запросС, ΠΈ Ρ‚Π΅ΠΌ самым ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π²ΠΈΠ΄ΠΎΠΌ строки запроса. ΠŸΠΎΡΠ»Π΅Π΄ΡΡ‚Π²ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ катастрофичСскими.

ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠ°Ρ Π°Ρ‚Π°ΠΊΠ° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ SQL–запрос, Π΄ΠΎΠ±Π°Π²ΠΈΠ² лишниС части ΠΈ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ² Β«Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅Β». НапримСр, Ссли ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Id, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Ρ‚ΡŒ Π² качСствС Π΅Π΅ значСния строку 1 or 2>1 – – , Ρ‚ΠΎΠ³Π΄Π° запрос ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ Π²ΠΈΠ΄:

...

SELECT ccnum FROM cust WHERE id=1 or 2>1 – –

УсловиС 2>1 истинно для всСх строк Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, поэтому запрос Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ всС строки ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ cust, Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π½ΠΎΠΌΠ΅Ρ€Π° всСх ΠΊΡ€Π΅Π΄ΠΈΡ‚Π½Ρ‹Ρ… ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡Π΅ΠΊ. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ классичСской Π°Ρ‚Π°ΠΊΠΎΠΉ Β«1 = 1Β», Π½ΠΎ сСтСвыС администраторы часто Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ поиск Ρ‚Π°ΠΊΠΎΠΉ строки Π² систСмы обнаруТСния Π²Ρ‚ΠΎΡ€ΠΆΠ΅Π½ΠΈΠΉ (IDS), поэтому ΠΌΡ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ»ΠΈ условиС Β«2>1Β», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡΡ‚ΠΎΠ»ΡŒ ΠΆΠ΅ эффСктивно, Π½ΠΎ Β«ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ΄ Π»ΡƒΡ‡ΠΎΠΌ Ρ€Π°Π΄Π°Ρ€Π°Β».

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ коммСнтария – – ΡƒΠ±ΠΈΡ€Π°Π΅Ρ‚ ΠΈΠ· поля зрСния сСрвСра всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ символы запроса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³Π»Π° Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. Π’ ΠΎΠ΄Π½ΠΈΡ… Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… для коммСнтирования ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ символы β€”, Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… – #. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ воспринимаСт Π² качСствС коммСнтария ваша Π±Π°Π·Π°.

Π Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π°Ρ‚Π°ΠΊ слишком ΠΌΠ½ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΈΡ… здСсь, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π”Ρ€ΡƒΠ³ΠΈΠ΅ рСсурсы».

РодствСнныС Π³Ρ€Π΅Ρ…ΠΈ

Π’ΠΎ всСх ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π³Ρ€Π΅Ρ…ΠΈ:

β–‘ соСдинСниС ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи с высоким ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ доступа;

β–‘ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ пароля Π² тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹;

β–‘ сообщСниС ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΡƒ излишнС ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² случаС ошибки.

Рассмотрим ΠΈΡ… ΠΏΠΎ порядку. Π’Π΅Π·Π΄Π΅ соСдинСниС устанавливаСтся ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ административного ΠΈΠ»ΠΈ высокопривилСгированного ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, хотя достаточно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎ доступ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ смоТСт ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ, Π° Ρ‚ΠΎ ΠΈ всСм сСрвСром. ΠšΠΎΡ€ΠΎΡ‡Π΅ говоря, соСдинСниС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с высоким ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ доступа – скорСС всСго, ошибка ΠΈ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ.

Β«Π—Π°ΡˆΠΈΠ²Π°Π½ΠΈΠ΅Β» ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Π² ΠΊΠΎΠ΄ – ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда порочная идСя. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ см. Π³Ρ€Π΅Ρ… 11 ΠΈ 12 ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ Ρ‚Π°ΠΌ «лСкарства».

НаконСц, Π² случаС ошибки ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π²ΡˆΠΈΡΡŒ Π΅ΠΉ, ΠΎΠ½ смоТСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ прСдставлСниС ΠΎ структурС запроса ΠΈ, Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚, Π΄Π°ΠΆΠ΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±Π°Π·Ρ‹. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ см. Π² Π³Ρ€Π΅Ρ…Π΅ 6.

Π“Π΄Π΅ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ

Π›ΡŽΠ±ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰Π΅Π΅ пСрСчислСнными Π½ΠΈΠΆΠ΅ характСристиками, ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½ΠΎ риску внСдрСния SQL:

β–‘ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ;

β–‘ Π½Π΅ провСряСт ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…;

β–‘ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ для запроса ΠΊ Π±Π°Π·Π΅;

β–‘ примСняСт ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡŽ ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½Ρƒ подстроки для построСния SQL–запроса Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ SQL exec (ΠΈΠ»ΠΈ Π΅ΠΉ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ).

ВыявлСниС ошибки Π½Π° этапС Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π°

Π’ΠΎ врСмя Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ возмоТности внСдрСния SQL ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго ΠΈΡ‰ΠΈΡ‚Π΅ мСста, Π³Π΄Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ запросы ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Ясно, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ, Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΌΡΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, эта Π½Π°ΠΏΠ°ΡΡ‚ΡŒ Π½Π΅ ΡƒΠ³Ρ€ΠΎΠΆΠ°Π΅Ρ‚. ΠœΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡ‰Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ конструкции:

Выяснив, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΅ΡΡ‚ΡŒ обращСния ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… [1] , Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π³Π΄Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ запросы ΠΈ насколько ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΌ, ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π² запросС. Π‘Π°ΠΌΠΎΠ΅ простоС – Π½Π°ΠΉΡ‚ΠΈ всС мСста, Π³Π΄Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ прСдлоТСния SQL, ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, производится Π»ΠΈ конкатСнация ΠΈΠ»ΠΈ подстановка нСбСзопасных Π΄Π°Π½Π½Ρ‹Ρ…, взятых, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ· строки Web–запроса, ΠΈΠ· Web–формы ΠΈΠ»ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° SOAP. Π’ΠΎΠΎΠ±Ρ‰Π΅, Π»ΡŽΠ±Ρ‹Ρ… ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΄Π°Π½Π½Ρ‹Ρ…!

ВСстированиС

Надо ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ добросовСстному Π°Π½Π°Π»ΠΈΠ·Ρƒ ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ внСдрСния SQL Π½Π΅ сущСствуСт. Но ΠΈΠ½ΠΎΠ³Π΄Π° Ρƒ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ доступа ΠΊ ΠΊΠΎΠ΄Ρƒ, ΠΈΠ»ΠΈ Π²Ρ‹ просто Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΡ‹Ρ‚Π° чтСния Ρ‡ΡƒΠΆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π’ΠΎΠ³Π΄Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π° тСстированиСм.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ всС Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π³Π΄Π΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ SQL–запросы. Π—Π°Ρ‚Π΅ΠΌ создайтС Ρ‚Π΅ΡΡ‚ΠΎΠ²ΡƒΡŽ программу–клиСнт, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ Π² эти Ρ‚ΠΎΡ‡ΠΊΠΈ частично Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. НапримСр, Ссли тСстируСтся Web–прилоТСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ строит запрос Π½Π° основС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΡ‹, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π½ΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова языка SQL. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Perl ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

...

#!/usr/bin/perl

use strict;

use HTTP::Request::Common qw(POST GET);

use HTTP::Headers;

use LWP::UserAgent;

srand time;

# ΠŸΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ исполнСниС, Ссли Π½Π°ΠΉΠ΄Π΅Π½Π° ошибка

my $pause = 1;

# ВСстируСмый URL

my $url = \'http://mywebserver.xyzzy123.com/cgi-bin/post.cgi\

# Максимально допустимый Ρ€Π°Π·ΠΌΠ΅Ρ€ HTTP-ΠΎΡ‚Π²Π΅Ρ‚Π°

my $max_response = 1000;

# ДопустимыС Π³ΠΎΡ€ΠΎΠ΄Π°

my @cities = qw(Auckland Seattle London Portland Manchester Redmond

Brisbane Ndola);

while (1) {

my $city = randomSQL($cities[rand @cities]);

my $zip = randomSQL(10000 + int(rand 89999));

print Β«ΠŸΡ€ΠΎΠ±ΡƒΡŽ [$city] ΠΈ [zip]\nΒ»;

my $ua = LWP::UserAgent->new();

my $req = POST $url,

[ City => $city,

ZipCode => $zip,

];

# ΠŸΠΎΡΠ»Π°Ρ‚ΡŒ запрос, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ ΠΈ ΠΏΠΎΠΈΡΠΊΠ°Ρ‚ΡŒ Π² Π½Π΅ΠΌ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΈ ошибки

my $res = $ua->request($req);

$_ = $res->as_string;

die "Π₯ост нСдостиТим\n" if /bad hostname/ig;

if ($res->status_line != 200

|| /error/ig

|| length($_) > $max_response) {

print "\nΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ внСдрСния SQL\n";

print;

getc if $pause;

}

}

# Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ случайноС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово SQL, Π² 50% случаСв пСрСвСсти

# Π΅Π³ΠΎ Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр

sub randomSQL() {

$_ = shift;

return $_ if ($rand > .75);

my @sqlchars = qw(1=1 2>1 Β«fred=Β»fre" + "d" or and select union                          drop update insert into dbo < > = ( ) \' .. β€“ #);

my $sql = $sqlchars[rand @sqlchars]; $sql = uc($sql) id rand > .5;

return $_ . \' \' . $sql if rand > .9;

return $sql . \' \' . $_ if rand > .9;

return $sql;

}

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ внСдрСния SQL Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сообщСниС ΠΎΠ± ошибкС. Как ΠΌΡ‹ ΡƒΠΆΠ΅ сказали, Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π°. Π”Ρ€ΡƒΠ³ΠΎΠΉ способ тСстирования Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ Perl–программой, Π·Π°Ρ€Π°Π½Π΅Π΅ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ выглядит Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚, Π° Π·Π°Ρ‚Π΅ΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π° ΠΊΠ°ΠΊΠΈΠ΅ запросы ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΎΡ‚Π²Π΅Ρ‚, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΎΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ, ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π°.

Π˜ΠΌΠ΅ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ инструмСнты Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ… Ρ„ΠΈΡ€ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ AppScan ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Sanctum (Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Watchfire) (www.watchfire.com), Weblnspect ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ SPI Dynamics (www.spidynamics.com) ΠΈ ScanDo ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Kavado (www.kavado.com).

Для ΠΎΡ†Π΅Π½ΠΊΠΈ инструмСнта Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ нСбольшоС тСстовоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с извСстными ошибками, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΌΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ SQL, ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ошибки этот инструмСнт сумССт Π½Π°ΠΉΡ‚ΠΈ.