Thứ Tư, 15 tháng 11, 2017

SOAP & RESTful - Giải pháp chính để giao tiếp với ứng dụng web

Web Service là gì?

Web Service là một dịch vụ web, nó là một khái niệm rộng hơn so với khái niệm web thông thường, nó cung cấp các thông tin thô, và khó hiểu với đa số người dùng, chính vì vậy nó được sử dụng bởi các ứng dụng. Các ứng dụng này sẽ chế biến các dữ liệu thô trước khi trả về cho người dùng cuối cùng.
Ví dụ bạn vào một trang web ABC nào đó để xem thông tin về thời tiết và chứng khoán. Trang web đó sẽ hiển thị cho bạn các thông tin bạn muốn.
Để có được các dữ liệu về thời tiết ứng dụng ABC cần phải lấy thông tin từ một nguồn nào đó, nó có thể là một dịch vụ web chuyên cung cấp các số liệu thời tiết ứng với các vùng miền khác nhau.
Tương tự như vậy để có các số liệu về chứng khoán ứng dụng ABC cũng cần phải liên hệ với dịch vụ cung cấp các số liệu này. Các dữ liệu sẽ được chế biến trước khi trả về cho bạn là một trang web hoàn chỉnh.
Các Web Service thường cung cấp các dữ liệu thô mà nó khó hiểu đối với đa số người dùng thông thường, chúng thường được trả về dưới dạng XML hoặc JSON.

RESTful Service là gì?

RESTful Web Service là các Web Service được viết dựa trên kiến trúc REST. REST đã được sử dụng rộng rãi thay thế cho cácWeb Service dựa trên SOAP và WSDL. RESTful Web Service nhẹ (lightweigh), dễ dàng mở rộng và bảo trì.
REST định nghĩa các quy tắc kiến trúc để bạn thiết kế Web services, chú trọng vào tài nguyên hệ thống, bao gồm các trạng thái tài nguyên được định dạng như thế nào và được truyền tải qua HTTP, và được viết bởi nhiều ngôn ngữ khác nhau. Nếu tính theo số dịch vụ mạng sử dụng, REST đã nổi lên trong vài năm qua như là một mô hình thiết kế dịch vụ chiếm ưu thế. Trong thực tế, RESTđã có những ảnh hưởng lớn và gần như thay thế SOAP và WSDL vì nó đơn giản và dễ sử dụng hơn rất nhiều.

Tổng quan ngắn gọn về SOAP

SOAP dựa hoàn toàn vào XML để cũng cấp các services truyền tin. Microsoft ban đầu phát triển SOAP để thay thế cho các công nghệ cũ hơn không hoạt động tốt trên Internet như Distributed Component Object Model (DCOM) and Common Object Request Broker Architecture (CORBA). Những công nghệ này không thành công vì chúng dựa vào truyền tin nhị phân, cách truyền tin XML mà SOAP sử dụng làm việc tốt hơn qua Internet.
XML được sử dụng để tạo ra các requests và nhận responses trong SOAP, nó có thể trở nên cực kỳ phức tạp. Trong một số ngôn ngữ lập trình, bạn cần phải xây dựng các requests đó bằng tay, điều này trở nên mơ hồ vì SOAP không dung nạp được các lỗi. Tuy nhiên, một vài ngôn ngữ khác có thể sử dụng các phím tắt mà SOAP cung cấp; Có thể giúp bạn giảm bớt effort cần thiết để tạo request và phân tích responses. Thực tế, khi làm việc với .NET, bạn thậm chí chưa bao giờ gặp đến XML.
Một trong những tính năng quan trọng nhất của SOAP là tích hợp trong xử lý lỗi. Nếu có sự cố với requests của bạn, responses chứa thông tin lỗi mà bạn có thể sử dụng để khắc phục sự cố. Bạn có thể không sở hữu các Web service, tính năng này đặc biệt vô cùng quan trọng; Nếu không bạn sẽ thắc mắc tại sao mọi việc lại không thành công. Các báo cáo lỗi thậm chí cung cấp mã code chuẩn để có thể tự động hoá một số nhiệm vụ xử lý lỗi trong mã của bạn.
Một tính năng khác khá thú vị của SOAP là bạn không nhất thiết phải sử dụng nó với giao thức HyperText Transfer Protocol (HTTP). Có một chỉ định rõ ràng để sử dụng SOAP qua Simple Mail Transfer Protocol (SMTP) và không có lý do gì bạn không thể sử dụng nó trên các phương thức khác.
Sự khác nhau giữa RESTful và SOAP Web Service

SOAP chắc chắn là lựa chọn nặng ký để truy cập Web service. Nó cung cấp những ưu điểm sau đây khi so sánh với REST:
  • Ngôn ngữ, nền tảng và phương tiện độc lập (REST yêu cầu sử dụng HTTP)
  • Hoạt động tốt trong môi trường doanh nghiệp (REST giao tiếp thẳng trực tiếp)
  • Tiêu chuẩn hoá
  • Cung cấp khả năng mở rộng đáng kể trước khi xây dựng dưới dạng các tiêu chuẩn WS *
  • Tích hợp xử lý lỗi
  • Tự động hóa khi sử dụng với một số sản phẩm ngôn ngữ
Bên cạnh đó, REST dễ sử dụng hơn và linh hoạt hơn. Nó có những lợi thế sau khi so sánh với SOAP:
  • Không có tools đắt tiền nào yêu cầu tương tác với Web service
  • Smaller learning curve
  • Hiệu quả (SOAP sử dụng XML cho tất cả các truyền tin, REST có thể sử dụng định dạng truyền tin ngắn gọn hơn)
  • Nhanh (không yêu cầu xử lý rộng rãi)
    Gần gũi hơn với các công nghệ Web khác trong triết lý design.

Thứ Sáu, 20 tháng 10, 2017

SQL Injection - Khanhdv

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

Tại sao SQL Injection lại “thần thánh”?

Những lý do sau đã tạo nên tên tuổi lừng lẫy của SQL Injection:
• Cực kỳ nguy hiểm – Có thể gây ra những thiệt hại khổng lồ. Với SQL Injection, hacker có thể truy cập một phần hoặc toàn bộ dữ liệu trong hệ thống.
• Rất phổ biến và dễ thực hiện – Lỗ hổng này rất nổi tiếng, từ developer đến hacker gần như ai cũng biết. Ngoài ra, còn có 1 số tool tấn công SQL Injection cho dân “ngoại đạo”, những người không biết gì về lập trình.
• Rất nhiều ông lớn từng bị dính – Sony, Microsoft UK. Mọi vụ lùm xùm liên quan tới “lộ dữ liệu người dùng” ít nhiều đều dính dáng tới SQL Injection

MỘT SỐ VÍ DỤ
1. TẤN CÔNG BẰNG MỆNH ĐỀ LUÔN ĐÚNG
Những lỗi lập trình này thường xảy ra ở các chức năng tìm kiếm hoặc đăng nhập tài khoản. Ví dụ một câu lệnh SQL như sau:
SELECT * FROM accounts WHERE userName = '{$userName}'
Đây có lẽ là một câu lệnh quen thuộc đối với mỗi dân code trong chúng ta. Tiếp theo mình sẽ chỉ cho các bạn thấy đoạn SQL trên có rủi ro như thế nào nhé. Giả sử trong ô đăng nhập người dùng nhập thêm đằng sau là
or '1' = '1'
 thì khi truy vấn, câu lệnh của chúng ta sẽ trở thành mệnh đề luôn đúng như dưới đây: 
SELECT * FROM accounts WHERE userName = '{$userName}' OR '1' = '1'
Vì là luôn đúng, nên câu lệnh trên luôn thực thi và trả về kết quả khiến hacker cùi bắp có thể dễ dàng đăng nhập vào hệ thống của bạn một cách dễ dàng, và điều này là hết sức nguy hiểm, nhất là các trang quản trị toàn bộ nội dung hệ thống như backend vậy. Lần đầu tiên khi mình lập trình web một trang kết bạn cùi bắp cũng bị lỗi này và bị hack mất bao nhiêu là tài khoản.
2. TẤN CÔNG PHÁ HOẠI TRỰC TIẾP DỮ LIỆU
Giả sử câu lệnh cũng như trên, nhưng không nhập ‘1’ = ‘1’ nữa mà thêm như sau:

SELECT * FROM accounts WHERE userName = '{$userName}'; DROP TABLE accounts; ''
SQL hỗ trợ thực hiện nhiều câu lệnh thông qua dấu phân tách là ; nên nếu bị chơi một phát như trên là lập tức bảng accounts của bạn sẽ bị drop sạch dữ liệu mà không thể khôi phục đấy

3. HƯỚNG KHẮC PHỤC
May thay, mặc dù SQL rất nguy hại nhưng cũng dễ phòng chống. Gần đây, hầu như chúng ta ít viết SQL thuần mà toàn sử dụng ORM (Object-Relational Mapping) framework. Các framework web này sẽ tự tạo câu lệnh SQL nên hacker cũng khó tấn công hơn.
Tuy nhiên, có rất nhiều site vẫn sử dụng SQL thuần để truy cập dữ liệu. Đây chính là mồi ngon cho hacker. Để bảo vệ bản thân trước SQL Injection, ta có thể thực hiện các biện pháp sau.
• Lọc dữ liệu từ người dùng: Cách phòng chống này tương tự như XSS. Ta sử dụng filter để lọc các kí tự đặc biệt (; ” ‘) hoặc các từ khoá (SELECT, UNION) do người dùng nhập vào. Nên sử dụng thư viện/function được cung cấp bởi framework. Viết lại từ đầu vừa tốn thời gian vừa dễ sơ sót.
• Không cộng chuỗi để tạo SQL: Sử dụng parameter thay vì cộng chuỗi. Nếu dữ liệu truyền vào không hợp pháp, SQL Engine sẽ tự động báo lỗi, ta không cần dùng code để check.
• Không hiển thị exception, message lỗi: Hacker dựa vào message lỗi để tìm ra cấu trúc database. Khi có lỗi, ta chỉ hiện thông báo lỗi chứ đừng hiển thị đầy đủ thông tin về lỗi, tránh hacker lợi dụng.
• Phân quyền rõ ràng trong DB: Nếu chỉ truy cập dữ liệu từ một số bảng, hãy tạo một account trong DB, gán quyền truy cập cho account đó chứ đừng dùng account root hay sa. Lúc này, dù hacker có inject được sql cũng không thể đọc dữ liệu từ các bảng chính, sửa hay xoá dữ liệu.
• Backup dữ liệu thường xuyên: Các cụ có câu “cẩn tắc vô áy náy”. Dữ liệu phải thường xuyên được backup để nếu có bị hacker xoá thì ta vẫn có thể khôi phục được. Còn nếu cả dữ liệu backup cũng bị xoá luôn thì … chúc mừng bạn, update CV rồi tìm cách chuyển công ty thôi!