Skip to content

SQL Injection халдлага, хэрхэн хамгаалах

December 1, 2006

Вэб апликешн хөгжүүлж буй хүмүүс SQL тарилга-ийн талаар маш сайн мэддэг байх, хэрхэн хамгаалах талаарх аргуудийг судалсан байх ёстой. Бусад нууцлал хамгаалалтын аргуудын талаар Очирхуяаг-ийн сонирхолтой нийтлэлээс олж уншаарай.

SQL тарилга нь апликешний өгөгдлийн баазын давхрагад үүсдэг, хэрэглэгчийн оруулсан өгөгдлийг буруу буюу дутуу шүүснээс шалтгаалан гардаг хамгаалалтын алдаа юм. Өөр үгээр хэлбэл апликешнийг хакдах түгээмэл арга юм.

Хэрхэн ашигладаг талаар хамгийн энгийн жишээ “Login” буюу “системд нэвтрэх” хэсэг дээр дээр авч үзье;

HTML форм;
<form name="frmLogin" action="Login.php" method="post">
Username: <input type="text" name="userName">
Password: <input type="text" name="password">
<input type="submit">
</form>

Хэрэглэгч нэрээ болон нууц үгээ оруулсаны дараа сабмит товчоо дарахад манай доорх Kод ажиллах болно;

<%
$result = mysql_query("select count(*) from users where
userName='" + userName + "' and userPass='" + password + "'" );

if(mysql_num_rows($result) > 0 )
// login амжилттай нэвтэрлээ

else
// login амжилтгүй
%>

Дээрх кодиг харахад эхний ээлжинд буруу зүйл байхгүй юм шиг авч SQL тарилгад өртөгдөх аюултай юм. Хэрэв хэрэглэгч

Username: ' or 1=1 ---
Password: [хоосон]

гэж оруулбал манай код хэрэглэгчийг системд нэвтруулэх болно. Учир ни манай SQL маань нэгээс олон хэрэглэгчийн мэдээллийг буцаах болно. Учир нь манай код доорх SQL-ийг ажиллуулна гэсэн үг

select count(*) from users where userName='' or 1=1 --' and userPass='

– тэмдэгт нь SQL-д талбарийг тодорхойлж байгаа учраас тэмдэгтээс хойших ямарч командийг ажиллуулахгүй гэсэн үг. Эсвэл бүр хорлонтой хакер бол дараагын өгөгдлүүдийг оруулж манай хэрэглэгчийн хүснэгтэд байгаа бүх хэрэглэгчийн мэдээллийг устгаж бас болно )

Username: ' or 1=1; drop table users; --
Password: [
хоосон]

MSSQL сэрвэр ашиглаж байвал бүр сэрвэрийг чини тэр чигээр нь унтрааж болно;

Username: '; shutdown with nowait; --
Password:
[хоосон]

За тэгвэл энэ бүгдээс хэрхэн хамгаалах вэ?

1. Өгөгдлийн баазад хандаж байгаа хэрэглэгчийн эрхийг хязгаарлах

Ихэнх тохиолдолд вэб апликеш нь өгөгдлийн баазны зөвхөн зарим нэгэн хэсэг руу хандах шаардлагатай байдаг. Тиймээс бид уг апликешн-д зөвхөн өөрт нь хэрэгтэй мэдээлэл рүү хандах эрхийг олгож өгөх нь чухал. Жишээ нь хүснэгт устгах, баазийг унтраах эрх ихэнх апликешн-д шаардлагагүй. Ийм замаар бид халдлагаас аль болох бага шарх авч гарах боломж ихсэнэ.

2. Хашилтийн тэмдэгтүүдээс зугтах

болон тэмдэгтүүд нь энэ халдагад гол ашиглагддаг тэмэдгтүүд байгаа юм. Энэ тэмдэгтүүдээс зугтах функцууд програмчлалын хэл болгонд байдаг. Жишээ нь

  • PHP – mysql_real_escape_string()
  • Perl – DBI::quote
  • Java – PreparedStatement
  • .NET – ADO.NET SqlCommand

3. Stored Procedure ашиглах

Програм дотроосоо SQL комманд үүсгэж дуудхынхаа оронд Stored Procedure буюу өмнө үүсгэгдсэн SQL процэдурүүдийг дуудах нь апликешний хурд хүчнээс гадна парамэтэрүүдийг шүүх сайн талтай.

4. Зарим тэмдэгтээс зугтах

; болон тэмдэгтүүд нь СQЛ командуудад ашиглагддаг тул ийм төрлийн тэмдэгтүүдийг зарим өгөгдлөөс шүүх хэрэгтэй.

Иймэрхүү аргууд байж болно. Мэдээж өөр аргууд байдаг байх л даа. Тодорхой, дэлгэрэхгүй мэдээллүүдийг доорх холбоосныыдаас олж уншина уу?

Эх сурвалж: http://bayarsaikhan.wordpress.com/2006/10/30/sql-injection-%d1%85%d0%b0%d0%bb%d0%b4%d0%bb%d0%b0%d0%b3%d0%b0-%d1%85%d1%8d%d1%80%d1%85%d1%8d%d0%bd-%d1%85%d0%b0%d0%bc%d0%b3%d0%b0%d0%b0%d0%bb%d0%b0%d1%85/
No comments yet

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: