Data Annotation trong .Net framework

Đây là một bài viết của mình hướng dẫn các bạn làm thế nào để sử dụng data annotation trong .Net framework.

Data Annotation là gì vậy ta ?

Data Annotation trong .Net framework giúp cho chúng ta bổ sung thêm các thông tin bổ sung cho dữ liệu, và việc này được thực hiện bằng các thêm các thẻ thuộc tính. Việc sử dụng Data Annotation giúp cho chúng ta dễ dàng quản lý các thuộc tính của dữ liệu trên một nơi duy nhất.

Các thuộc tính của Data Annotation có thể được chia làm ba loại:

  • Validation Attributes: sử dụng để thực thi điều kiện xác thực
  • Display Attributes: sử dụng để xác định các lớp / thành viên được hiển thị trên giao diện như thế nào.
  • Modeling Attributes:  sử dụng để xác định mục đích sử dụng và mối quan hệ của các lớp.

Để giúp các bạn hiểu rõ hơn thì chúng ta sẽ đi qua một ví dụ đơn giản về việc ứng dụng Data Annotation nhé. Trong ví dụ này, bài toán của chúng ta là cần quản lý các nhân viên tại một công ty, trong đó yêu cầu rằng các thông tin của một nhân viên phải thỏa mãn các điều kiện:

  • Tên: không được bỏ trống và có nhiều hơn 2 và không vượt qua 100 ký tự.
  • Tuổi: nằm trong khoảng từ 18 đến 99.
  • Email và số điện thoại: phải có định dạng đúng.

     Ví dụ minh họa

Bước 1:

Đầu tiên chúng ta sẽ tạo một project Console Application

anh 11

Bước 2

Chúng ta sẽ tạo ra một lớp Employee để chứa các các trường thông tin cho nhân viên cho lớp đó:

anh 2

Bước 3:

Các bạn nhìn vào thanh Solution Explorer, click chuột phải vào References, chọn Add Reference… sau đó các bạn chọn Assembilies trên thanh bên trái và tíc vào các thẻ như trong hình dưới đây. Trong trường hợp Visual Studio của bạn chưa có các thẻ này thì các bạn cài đặt thêm nha.

anh 3

Bước 4

Các bạn thêm các trường như Name, Age, PhoneNumber và Email cho lớp Employee.

anh 4

Bước 5:

Chúng ta sẽ thêm các thông tin bổ sung cho từng trường theo như yêu cầu. Tuy nhiên đến đây chương trình đã báo lỗi do chúng ta chưa import các thư viện mà chúng ta sử dụng thêm trong Refereces.

anh 5

Do đó các bạn chỉ cần thêm using System.ComponentModel.DataAnnotations là được. Sau đó chúng ta sẽ thêm nốt các thông tin còn lại cho các trường ấy:

anh 6

Bước 6

Chúng ta sẽ kiểm tra khả năng Validation chúng ta sẽ chuyển sang file Program.cs. Các bạn code theo mẫu dưới đây nhé.anh 7

Các bạn có thể thấy, ở trong file Program.cs phần tên, số điện thoại và email đang chưa phù hợp với điều kiện, chúng ta thử nhấn F5 để chạy chương trình xem có nhận được thông báo lỗi ở các thông tin đó không nhé.anh 8

Chúng ta có thể thấy rằng phần các phần đó đã được báo lỗi là không thỏa mãn điều kiện. Các bạn có thể thay đổi thông tin Name, Age, PhoneNumber Email để nhận được các kết quả khác nhé.

Như vậy chúng ta có thể thấy rằng việc thêm các thuộc tính Data Annotation đã giúp chúng ta xác thực các thông tin của nhân viên.

Cám ơn các bạn đã theo dõi bài viết này. Mình sẽ sớm gặp lại các bạn trong bài viết tiếp theo.

Ghi chú: Đoạn code minh họa mình lấy từ trang https://code.msdn.microsoft.com/Basic-Introduction-to-Data-244734a4

SQL Injection

SQL injection là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ hổng của việc kiểm tra dữ liệu đầu vào trong các ứng dụng web và các thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành các câu lệnh SQL bất hợp pháp. SQL injection có thể cho phép những kẻ tấn công thực hiện các thao tác, delete, insert, update, v.v. trên cơ sở dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy. SQL injection thường được biết đến như là một vật trung gian tấn công trên các ứng dụng web có dữ liệu được quản lý bằng các hệ quản trị cơ sở dữ liệu như SQL ServerMySQLOracleDB2Sysbase

Các dạng lỗi thường gặp

a) Không kiểm tra ký tự thoát truy vấn

statement = "SELECT * FROM users WHERE name = '" + userName + "';"

Câu lệnh này được thiết kế để trả về các bản ghi tên người dùng cụ thể từ bảng những người dùng. Tuy nhiên, nếu biến “userName” được nhập chính xác theo một cách nào đó bởi người dùng ác ý, nó có thể trở thành một câu truy vấn SQL với mục đích khác hẳn so với mong muốn của tác giả đoạn mã trên. Ví dụ, ta nhập vào giá trị của biến userName như sau:

a’ or ‘t’=’t

Khiến câu truy vấn có thể được hiểu như sau:

SELECT * FROM users WHERE name = 'a' or 't'='t';

Nếu đoạn mã trên được sử dụng trong một thủ tục xác thực thì ví dụ trên có thể được sử dụng để bắt buộc lựa chọn một tên người dùng hợp lệ bởi ‘t’=’t’ luôn đúng. Trong khi hầu hết các SQL server cho phép thực hiện nhiều truy vấn cùng lúc chỉ với một lần gọi, tuy nhiên một số SQL API như mysql_query của php lại không cho phép điều đó vì lý do bảo mật. Điều này chỉ ngăn cản tin tặc tấn công bằng cách sử dụng các câu lệnh riêng rẽ mà không ngăn cản tin tặc thay đổi các từ trong cú pháp truy vấn. Các giá trị của biến “userName” trong câu truy vấn dưới đây sẽ gây ra việc xoá những người dùng từ bảng người dùng cũng tương tự như việc xóa tất cả các dữ liệu được từ bảng dữ liệu (về bản chất là tiết lộ các thông tin của mọi người dùng), ví dụ này minh họa bằng một API cho phép thực hiện nhiều truy vấn cùng lúc:

a’;DROP TABLE users; SELECT * FROM data WHERE ‘t’ = ‘t

Điều này đưa tới cú pháp cuối cùng của câu truy vấn trên như sau:

SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM data WHERE 't' = 't';

b) Xử lý không đúng kiểu

Lỗi SQL injection dạng này thường xảy ra do lập trình viên hay người dùng định nghĩa đầu vào dữ liệu không rõ ràng hoặc thiếu bước kiểm tra và lọc kiểu dữ liệu đầu vào. Điều này có thể xảy ra khi một trường số được sử dụng trong truy vấn SQL nhưng lập trình viên lại thiếu bước kiểm tra dữ liệu đầu vào để xác minh kiểu của dữ liệu mà người dùng nhập vào có phải là số hay không. Ví dụ như sau:

statement:= "SELECT * FROM data WHERE id = " + a_variable + ";"

Ta có thể nhận thấy một cách rõ ràng ý định của tác giả đoạn mã trên là nhập vào một số tương ứng với trường id – trường số. Tuy nhiên, người dùng cuối, thay vì nhập vào một số, họ có thể nhập vào một chuỗi ký tự, và do vậy có thể trở thành một câu truy vấn SQL hoàn chỉnh mới mà bỏ qua ký tự thoát. Ví dụ, ta thiết lập giá trị của biến a_variable là:

1;DROP TABLE users

khi đó, nó sẽ thực hiện thao tác xóa người dùng có id tương ứng khỏi cơ sở dữ liệu, vì câu truy vấn hoàn chỉnh đã được hiểu là:

SELECT * FROM data WHERE id=1;DROP TABLE users;

c) Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu

Đôi khi lỗ hổng có thể tồn tại chính trong phần mềm máy chủ cơ sở dữ liệu, như là trường hợp hàm mysql_real_escape_string() của các máy chủ MySQL. Điều này sẽ cho phép kẻ tấn công có thể thực hiện một cuộc tấn công SQL injection thành công dựa trên những ký tự Unicode không thông thường ngay cả khi đầu nhập vào đang được thoát. Chữ đậm

Blind SQL injection

Lỗi SQL injection dạng này là dạng lỗi tồn tại ngay trong ứng dụng web nhưng hậu quả của chúng lại không hiển thị trực quan cho những kẻ tấn công. Nó có thể gây ra sự sai khác khi hiển thị nội dung của một trang chứa lỗi bảo mật này, hậu quả của sự tấn công SQL injection dạng này khiến cho lập trình viên hay người dùng phải mất rất nhiều thời gian để phục hồi chính xác từng bit dữ liệu. Những kẻ tấn công còn có thể sử dụng một số công cụ để dò tìm lỗi dạng này và tấn công với những thông tin đã được thiết lập sẵn.

Thay đổi giá trị điều kiện truy vấn

Dạng lỗi này khiến cho kẻ tấn công có thể thay đổi giá trị điều kiện trong câu truy vấn, làm sai lệch sự hiển thị của một ứng dụng chứa lỗi này.

SELECT booktitle from booklist where bookId = 'OOk14cd' AND 1=1;

 

Sẽ hiển thị một trang một cách bình thường, trong khi:

SELECT booktitle from booklist where bookId = 'OOk14cd' AND 1=2;

 

sẽ hiển thị một nội dung khác, hoặc không hiển thị gì nếu ứng dụng web có chứa lỗi SQL injection dạng này. Lỗ hổng dạng này còn cho phép tin tặc không chỉ gây ảnh hưởng tới bảng hay dữ liệu hiện tại mà còn ảnh hưởng tới những dữ liệu hay bảng khác phụ thuộc vào nội dung của dữ liệu hay bảng hiện tại.

Điều kiện lỗi

Lỗi SQL injection dạng này dẫn tới việc buộc cơ sở dữ liệu chỉ được phép đánh giá khi mà giá trị của câu lệnh WHERE là đúng. Ví dụ:

SELECT 1/0 from users where username='Ralph';

 

Phép chia cho 0 chỉ được đánh giá là lỗi khi mà người dùng có tên “Ralph” tồn tại trong cơ sở dữ liệu.

Thời gian trễ

Lỗi SQL injection dạng này tồn tại khi thời gian xử lý của một hay nhiều truy vấn SQL phụ thuộc vào dữ liệu logic được nhập vào hoặc quá trình xử lý truy vấn của SQL engine cần nhiều thời gian. Tin tặc có thể sử dụng lỗi SQL injection dạng này để xác định thời gian chính xác mà trang cần tải khi giá trị nhập vào là đúng.

Mô hình MVVM

Mô hình MVVM có thể được sử dụng trên tất cả các nền tảng XAML. Mục đích của nó là cung cấp một sự phân tách rõ ràng giữa phần giao diện điều khiển của người dùng và phần xử lý logic.

Có 3 thành phần chính của mô hình MVVM: View, Model và ViewModel. Mỗi thành phần xử lý các nhiệm vụ hoàn toàn tách biệt. Hình vẽ dưới đây miêu tả mối quan hệ giữa các thành phần đó.

Capture.PNG

Cụ thể chức năng của các thành phần như sau:

View: Tương tự như trong mô hình MVC, View là phần giao diện của ứng dụng để hiển thị dữ liệu và nhận tương tác của người dùng. Một điểm khác biệt so với các ứng dụng truyền thống là View trong mô hình này tích cực hơn. Nó có khả năng thực hiện các hành vi và phản hồi lại người dùng thông qua tính năng binding, command.

Model: Cũng tương tự như trong mô hình MVC. Model là các đối tượng giúp truy xuất và thao tác trên dữ liệu thực sự.

ViewModel: Lớp trung gian giữa View và Model. ViewModel có thể được xem là thành phần thay thế cho Controller trong mô hình MVC. Nó chứa các mã lệnh cần thiết để thực hiện data binding, command.

Một điểm cần lưu ý là trong mô hình MVVM, các tầng bên dưới sẽ không biết được các thông tin gì về tầng bên trên nó.

Dưới đây là một ví dụ áp dụng mô hình MVVM cho XAML.

https://github.com/vutung3196/DataBinding-Example

The Craft of Coding

Musings on programming and education

little Ngan in the big wide world

Cùng Ngân chia sẻ những khoảnh khắc vụn vặt trong cuộc sống!

the MOD(ularity) Squad

supervised by yvonne coady

The Daily Post

The Art and Craft of Blogging

WordPress.com News

The latest news on WordPress.com and the WordPress community.