PDA

View Full Version : Thử tí coi răng !


Mapcon
18-12-2002, 06:56 PM
Flood:
Trong một thời gian ngắn gửi nhiều record để server insert vào . Ví dụ record với khoảng 10 field lưu giữ tối đa là 10KB. Nếu gửi đầy đủ đi thì để insert thêm 100record thôi nó đã phải tốn đến 1000KB~1MB. Nhưng nếu mỗi field nó chỉ gửi lượng dữ liệu tối thiểu, chẳng hạn 10 field chỉ tốn 64 byte thì với 1MB dữ liệu, nó có thể insert 16384 record. Nhưng mà đặc điểm của CSDL là nó thường thì dù dùng ít hay nhiều, trong một số trường hợp nó vẫn dùng một khoảng trống lớn (lưu các trưòng cố định như số, ngày tháng, dùng char thay vì varchar...). Như vậy, có trường hợp chỉ với 1MB dữ liệu gửi đi server sẽ phải lưu lại đến 160MB (16384*10*1024 byte).
Khắc phục:
Có lẽ đầu tiên người ta sẽ nghĩ đến dùng cookie (hay các biến session) để lưu thời gian gửi trước đó. Nếu nó gần quá thì bỏ qua không lưu lại trên server. Nhưng mà cách này sẽ toi nếu dữ liệu gửi đi từ một chương trình tự viết hay client cấm cookie. Nên có cách nữa là sử dụng một bảng trong CSDL để lưu lại IP cùng với thời gian insert record gần nhất của IP đó. Nếu quá gần (thường lấy 30s) thì không insert.
Nhưng nếu thằng nào viết được chương trình thay đổi IP liên tục thì cũng toi...
Nhưng nếu thô bỉ hơn thì có thể mần theo cai kiểu " Chân đất " chẳng hạn :
- Chỉ cho phép insert sau một thời gian nào định sẵn.
- Buộc dữ liệu gửi phải đầy đủ thông tin. cách này có lẽ hiệu quả hơn nhưng hơi khó chịu.

Cách này cũ roài , nói chung chỉ thích hợp với những site do những người mới học tự viết. Nó đơn thuần đánh vào đặc điểm của SQL là sử dụng hai dấu nháy đơn để phân tách xâu.
Chẳng hạn bạn có hai biến username và password. câu truy vấn sau là không tốt (dấu & trong VBScript )
[b]
"SELECT * FROM MEMBERS WHERE username='" & username & "' AND password='" & password & "'"

Nếu ai mà nhâp username là 1' OR ('1'='1và password là ') OR ''=' thì câu lệnh trở thành

SELECT * FROM MEMBERS WHERE username='1' OR ('1'='1' AND password='') OR ''=''

và người ta có thể đăng nhập dễ dàng làm admin.
...................
Tuỳ vào dùng DBMS nào mà có cách khắc phục (nói chung là dùng một kí tự báo hiệu nào đó để DBMS biết đó là dữ liệu chứ không phải là dấu phân tách). Ví dụ với Access và SQL Server thì đơn giản là dùng hai dấu '' để biểu diễn một dấu '.

Ví dụ nếu bạn nhập tên là ptthlamson's thì khi chèn vào SQL query, ----> ptthlamson''s.