Một số lỗi khi lập trình web hay gặp phải
2. Lỗi về SQL injection:
Lang thang trên net gặp được cái này, tui nghĩ nó có ích chó cậcbn newbie như tui đây. he he cùng vộc nào
Cơ sở dữ liệu(database) được coi như là "trái tim" của hầu hết các website. Nó chứa đựng những dữ liệu cần thiết để website có thể chạy và lưu trữ các thông tin phát sinh trong quá trình chạy. Nó cũng lưu trữ những thông tin cá nhân , thẻ tín dụng , mật khẩu của khách hàng , của user và thậm chí là cả của Administrator. Hơn cả thế nữa , database còn lưu trữ cả những chi tiết về hoá đơn mua hàng , chi tíêt hàng hoá...Đó chính là lý do mà việc bảo vệ Database của 1 website lại rất quan trọng để bảo vệ quyền lợi khách hàng, vận hành việc kinh doanh 1 cách hiệu quả.
Nhưng điều gì xảy ra khi bạn nhận ra rằng những dữ liệu đó không an toàn. Điều gì sẽ xảy ra khi bạn nhận ra rằng có 1 lỗi bảo mật mới được phát hiện ? Bạn sẽ trả lời ngay rằng bạn sẽ tìm kiếm 1 phiên bản sữa lổi (patch) hoặc nâng cấp ứng dụng lên version mới hơn. Nhưng bạn sẽ không ngờ rằng ,còn có 1 loại lỗi khác không thể nào trông chờ vào việc sửa chữa của hãng viết softwares vì lỗi này phát sinh là do...chính bạn. Lỗi SQL Injection (Chèn lệnh SQL).
SQL Injection là gì ?
Ngày nay các ứng dụng SQL ngày càng trở nên thân thiện hơn và dễ sử dụng hơn. Nhưng theo qui tắc bảo mật, cái gì càng dễ sử dụng và càng nhiều tính năng thì càng dễ bị tấn công và điều này hoàn toàn đúng với 1 số phiên bản của ngôn ngữ SQL mà tôi sẽ mô tả sau đây bằng 2 công nghệ thông dụng nhất hiện nay , ngôn ngữ ASP và Ms.SQL server.
Như bạn đã biết, ngôn ngữ SQL (Structured Query Language) thông thường là sự kết hợp của những lệnh như SELECT , UPDATE hay INSERT... Như với SELECT, sau mỗi lệnh là sự trả về 1 số data cần thiết, vd như
SQL
SELECT * FROM Users WHERE userName = 'justin';
Định nghĩa
SQL
WHERE userName = 'justin'
có nghĩa rằng chúng ta múôn biết tất cả các thông tin về username có tên là justin. Bởi vì ngôn ngữ SQL gần với câu nói tự nhiên , dễ hiểu như vậy nên nó đã nhanh chóng được tiếp nhận và nó cũng mở ra cơ hội cho việc khai thác lỗi SQL Injection bằng cách "nói thêm".
Bằng cách chèn thêm 1 vài dòng vào , hackers có thể gây ra sự nhầm lẫn của server và thực hiện 1 ý đồ khác ngoài mục tiêu của chương trình. Hãy xem xét ví dụ sau:
Thông thường , để kiểm tra đăng nhập 1 user, đa số website sẽ cung cấp 1 form như sau:
SQL
<form name="frmLogin" action="login.asp" method="post">
Username: <input type="text" name="userName">
Password: <input type="text" name="password">
<input type="submit">
</form>
Khi users nhấn nút Submit, website lập tức chuyển data đến files login.asp qua hàm Request.Form . Sau đó , 1 câu SQL sẽ được thực hiện để xác định danh tính user này. Chúng ta có thể tạo 1 files login.asp như sau:
SQL
<%
dim userName, password, query
dim conn, rS
userName = Request.Form("userName")
password = Request.Form("password")
set conn = server.createObject("ADODB.Connection")
set rs = server.createObject("ADODB.Recordset")
query = "select * from users where userName='" &
userName & "' and userPass='" & password & "'"
conn.Open "Provider=SQLOLEDB; Data Source=(local);
Initial Catalog=myDB; User Id=sa; Password="
rs.activeConnection = conn
rs.open query
if not rs.eof then
response.write "Logged In"
else
response.write "Bad Credentials"
end if
%>
Và sau đó , hãy tạo 1 database mẫu như sau:
SQL
create database myDB
go
use myDB
go
create table users
(
userId int identity(1,1) not null,
userName varchar(50) not null,
userPass varchar(20) not null
)
insert into users(userName, userPass) values('admin', 'wwz04ff')
insert into users(userName, userPass) values('john', 'doe')
insert into users(userName, userPass) values('fsmith', 'mypassword')