2009-03-17

SQL injection алдаанаас ASP/.NET дээр хэрхэн хамгаалах вэ? 3-р хэсэг.

Алдаатай коде

Dim NER as String
Dim SqlQuery as String

NER = Request.QueryString("NER")
SqlQuery = "SELECT lname, fname FROM users WHERE user_id = '" + NER + "'"

Хэвийн ажиллагаа

' Дээрх кодыг агуулж буй хуудас ингэж дуудагдан ажиллана
http://yourwebsite.mn/userlist.aspx?NER=Yourname

' Database дээр ажиллах Query
SELECT lname, fname FROM authors WHERE user_id = 'Yourname'

Дайралт

' Дээрх кодыг агуулж буй хуудас ингэж дуудагдан ажиллана
http://yourwebsite.mn/userlist.aspx?NER=';SQL... --

' Database дээр ажиллах query
SELECT lname, fname FROM authors WHERE user_id = '';SQL ... --

Хамгаалалт

Dim NER as String = Request.QueryString("NER")
Dim cmd As new SqlCommand("SELECT lname, fname FROM authors
WHERE au_id = @au_id")
Dim param = new SqlParameter("au_id", SqlDbType.VarChar)
param.Value = NER
cmd.Parameters.Add(param)
...

2009-03-16

SQL injection алдаанаас PHP дээр хэрхэн хамгаалах вэ? 2-р хэсэг.


PHP дээрх алдаатай жишээнүүд

Жишээ 1
$result=mysql_query('SELECT * FROM users WHERE username="'.$_GET['username'].'"');
Дайралт 1
http://host/?username=testuser' or 2=2

Жишээ 2
$result=mysql_query('SELECT * FROM news WHERE id="'.$_GET['id'].'"');
Дайралт 2
http://host/?id=-1 union select 1,2,3 ...




PHP хэл дээр хамгаалах жишээ 1

PHP хэлний функцуудыг ашиглан хамгаалж болно.


function Query_tseverleh($string)
{
// "\" тэмдэгтийн давхцал үүсгэхээс сэргийлэх
if(get_magic_quotes_gpc())
{
$string = stripslashes($string);
}
if (phpversion() >= '4.3.0')
{
$string = mysql_real_escape_string($string);
}
else
{
$string = mysql_escape_string($string);
}
return $string;
}

Хэрэглэгчийн нэрийг формоор дамжуулан авахдаа дараах хэлбэрийн коде бичиж сэргийлнэ.


if (isset($_GET['username']))
{
$hereglegch = Query_tseverleh($_GET['username']);
...
$result=mysql_query('SELECT * FROM news WHERE id="'.$hereglegch.'"');
...
}

PHP хэл дээр хамгаалах жишээ 2

PHP хэлний "mysqli" нэмэлт санг(http://www.php.net/mysqli) хэрэглэн хамгаалж болно. PHP 4.1-ээс дээших хувилбар дээр ажиллах болно.


$db = new mysqli("localhost", "username", "password", "database");
$stmt = $db -> prepare("SELECT username FROM testUsers
WHERE username=? AND password=?");
$stmt -> bind_param("ss", $user, $pass);
// Bind параметрүүд s - string, b - boolean, i - int, г.м
$stmt -> execute();
$stmt -> bind_results($result);
$stmt -> fetch();
echo "Username=" . $result ;
$stmt -> close();
...

SQL injection алдаанаас хэрхэн хамгаалах вэ? 1-р хэсэг.


Вэб сервер үрүү хэрэглэгчээс ирж буй мэдээллийг заавал шалгаж байх гэсэн алтан дүрэм байдаг. Иймд формын утгыг дараах аргуудаар хязгаарлаж байх нь SQL injection алдаанаас хамгаалах болно.

1. Сервер талдаа уртыг хязгаарлах

2. Тохирсон өгөгдлийг шалгах. Тухайлбал зөвхөн тоо авах утганд тооноос өөр утга байгааг шалгах.

3. Хоосон зай болон SQL бичлэгт ашиглагддаг тэмдэгтүүдийг шалгаж, цэвэрлэх

4. Параметр-т(Parameterized query) хэлбэрийн Query ашиглах

5. Холболтын эрхийг хязгаарлах. Тухайлбал зөвхөн мэдээлэл унших SELECT query ашиглаж байгаа бол READ ONLY эрхээр холболт хийх.

6. Алдааны мэдээллийг дэлгэрэнгүй Debug хэлбэрээр өгөхгүй байх.

7. Нууц мэдээлэл хадгалдаг талбаруудыг кодлох.

Дараагийн нийтлэлүүд дээрээ дээрх аргуудыг тайлбарлан түгээмэл ашиглагддаг PHP, ASP, JAVA хэлүүд дээр жишээ бичих болно.

Блогын талаар

SQL injection, File inclusion гээд нилээд олон төрлийн 10 илүү жил насалсан хуучны алдаануудыг манай залуучууд одоо болтол гаргасаар байгаа нь сэтгэл эмзэглүүлэх боллоо.

Энэ байдал нь мэдээллийн аюулгүй байдалд ноцтойгоор нөлөөлж ч болохоор харагдаад байна.

Иймд вэб хуудас хийж буй болон вэбийг үйл ажиллагаандаа ашиглаж буй газруудад тус дэм болох үүднээс өөрийн өчүүхэн мэдлэгээ хуваалцахаар шийдэж энэхүү блогийг нээлээ.

Мөн төгс хамгаалалтыг буй болгох болон цоорхойг илрүүлэн халдах асуудал мөнхийн тэмцэл байх болов уу.

Энэ блогын талаар санал, зөвлөмж ирүүлж, хамтран ажиллах асуудал нээлттэй болно.