Chuong LXI : Phần 2 SQL Advanced (bài 15)

Phần 2 SQL Advanced (bài 15)

 

Với một số kiến thức cơ bản về SQL ở trên bạn có thể làm gì nào ?
Bây giờ ta sẽ thử xét với phương diện của người lập trình web :
Tạo 1 database tên hacker với các trường như sau :

Trích:

create database hacker
use hacker

Create table admin(
[id] numeric not null,
username nvarchar(10) not null,
[password] nvarchar(10) not null,
address nvarchar(30),
phone numeric(10)
)

select * from admin

Insert vào một số data :

Trích:

insert into admin ([id],username,[password],address,phone)
values (1,’admin’,12345,’Ha Noi’,048324245)
go
insert into admin ([id],username,[password],address,phone)
values (2,’Neo’,12345,’Ha Noi’,048324245)

Rồi okie ta thấy table admin như sau :

Giờ muốn select những username trong table admin mà có address tại Hà Nội thì câu query sẽ như sau : (tất cả những giá trị là character thì phải được bao trong dấu quote ‘)

Trích:

select username from admin where address=’Ha Noi’

Vậy nếu ta viết thế này thì sẽ có chuyện gì xảy ra nhỉ

Trích:

select username from admin where address=”or 1=1–‘

Kết quả cũng show ra như trên.

Như trên ta thấy đáng lẽ ra address mang giá trị là Ha Noi nhưng nếu ta thay giá trị đó bằng ‘or 1=1– thì dấu quote đằng trước sẽ là 2 dấu ” có nghĩa giá trị trong đó rỗng . Và sau nó là or 1=1 , như ta đã biết or là câu lệnh điều kiện và ở đây có nghĩa là hoặc.
Mà giá trị đằng trước là rỗng nên SQL sẽ chạy tiếp theo gặp điều kiện or thì tất nhiên sẽ thực thi lệnh này mà or 1=1– , 1=1 thì luôn đúng , còn dấu — sẽ biến tất cả những thứ đằng sau thành chú thích (trong SQL quy định sau dấu — là câu chú thích). Như vậy câu truy vấn hoàn toàn hợp lệ và ko có lỗi gì cả và nó sẽ show cho ta toàn bộ username của admin , đến đây chắc bạn đã hiểu rồi chứ

Còn về câu lệnh UNION :

Như đã biết câu lệnh UNION dùng để gộp chuỗi lại với nhau và các giá trị trong 2 chuỗi đó phải là tương ứng .
Ví dụ :

Trích:

select username from admin
UNION
select [password] from admin

Câu lệnh trên sẽ show cho ta thấy các username và password trong table admin.
Khi tạo table bạn để ý thấy username ta gán thuộc tính là nvarchar , vậy nếu khi truy vấn bằng UNION , dòng thứ 2 bạn thay [password] thành số bất kì (ví dụ 1) thì sẽ báo lỗi sau :

Câu truy vấn :

Trích:

select username from admin
UNION
select 1 from admin

Error :

Trích:

Syntax error converting the nvarchar value ‘admin’ to a column of data type int.

Hô hô error báo sai cú pháp ,ko thể chuyển từ kiểu dữ liệu nvarchar (chuỗi) sang int (số) được vì dòng thứ 2 ta thay thế giá trị là kiểu int –> ko cùng loại dữ liệu —>error và show ra cái table admin . Còn khi áp dụng trên web thì đây là dấu hiệu cho thấy table admin là có tồn tại .

Đây chỉ là một số ví dụ để các bạn có thể hiểu về SQL injection ,mong giúp được gì đó cho các bạn !

Mà còn cách fix thì sao nhỉ , trong SQL có một thứ gọi là trigger
Hàm này có tính năng tương tự như hàm bắt sự kiện trong JavaScript , ta sẽ viết 1 hàm để bắt những lỗi trên hoặc có thể viết = chính ngôn ngữ lập trình web.
Còn cách viết thế nào thì phải nhờ anh DarkHawk cái nhẩy –Chuyên gia

 

dondoc (vniss)

 

  1. Leave a comment

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: