Tuesday, August 21, 2007

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

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

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

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

HTML форм;

" method="post">
Username:
Password:

Хэрэглэгч нэрээ болон нууц үгээ оруулсаны дараа сабмит товчоо дарахад манай доорх 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Л командуудад ашиглагддаг тул ийм төрлийн тэмдэгтүүдийг зарим өгөгдлөөс шүүх хэрэгтэй.

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


1 Comment:

Зүтгэ, Бас дахин зүтгэ said...

Mash heregte medeelel bna.
Neree sql deer yag iimerhuu aldaa garaad bdagiin.
Heregte zuils bna tnx


eXTReMe Tracker

© Blogger Templates from Webtalks