Giải mạo tên miền khó có thể phát hiện ra trên trình duyện Firefox, Chrome và Opera

Cho đến khi các nhà cung cấp trình duyệt vá được lỗ hổng này, cách hữu hiệu để chống lại loại tấn công giả mạo này là tự mình gõ các tên miền quan trọng thay vì click vào các đường link từ đâu đó.

Một nhà nghiên cứu bảo mật thông tin Trung Quốc đã khám phá ra một phương pháp tấn công giả mạo “gần như không thể phát hiện ra”, có thể đánh lừa, ngay cả những người dùng cẩn thận nhất trên Internet.
Theo những gì anh cảnh báo, các hacker có thể sử dụng một lỗ hổng đã biết trên trình duyệt Chrome, Opera và Firefox để hiển thị các tên miền giả mạo cho các website dịch vụ hợp pháp, như Apple, Google hay Amazon để ăn cắp các thông tin đăng nhập và tài khoản ngân hàng, hay các thông tin nhạy cảm khác của người dùng.
Trên các trình duyệt, lớp phòng thủ hữu hiệu nhất chống lại các cuộc tấn công lừa đảo là gì? Đối với người dùng thông thường, đó hẳn là biểu tượng của giao thức kết nối HTTPS xuất hiện trên thanh địa chỉ mỗi lần sau khi trang web được tải xuống.
Thế nhưng, hãy nhìn tấm hình bên dưới, vẫn là giao thức HTTPS, địa chỉ cực chuẩn Apple.com, bạn không thể tin rằng đó lại là một trang web giả mạo?
Nếu vậy, trước khi đi vào các chi tiết sâu hơn, thực chất đó là trang web có địa chỉ https://xn--80ak6aa92e.com, do nhà nghiên cứu bảo mật Trung Quốc Xudong Zheng, người khám phá ra cách tấn công này, tạo ra.

Nếu trình duyệt của bạn hiển thị như trên, có nghĩa là bạn có thể bị tấn công bởi kỹ thuật tinh vi này.

Nếu trình duyệt web của bạn đang hiển thị apple.com với thanh địa chỉ được bảo mật SSL, nhưng nội dung trang web đến từ một máy chủ khác (như được thấy trong hình ảnh trên), có nghĩa là trình duyệt của bạn có thể bị ảnh hưởng bởi một cuộc tấn công những từ đồng âm (homograph attack).
Gần như không thể xác định xác định trang web đó là giả mạo nếu không kiểm tra cẩn thận đường link URL hay chứng chỉ SSL của trang web.” Xudong Zheng cho biết trên blog của mình.
Còn có một website proof-of-concept khác (https://www.xn--e1awd7f.com), tạo ra bởi các chuyên gia bảo mật từ Wordfence để trình diễn lỗ hổng của trình duyệt. Trang web này giả mạo tên miền "epic.com".
Kỹ thuật tấn công đồng âm đã được biết đến từ năm 2001, nhưng các nhà cung cấp trình duyệt đã gặp nhiều khó khăn để sửa chữa vấn đề này. Nó là một loại tấn công giả mạo, khi địa chỉ website dù trông có vẻ hợp pháp nhưng thực ra không phải, bởi vì một hay nhiều ký tự đã bị thay thế với các ký tự Unicode một cách lừa đảo.
Nhiều ký tự Unicode, dùng để biểu diễn cho các bảng chữ cái của tiếng Hy Lạp, Cyrillic, và Armenian trong các tên miền quốc tế, nếu nhìn bằng mắt thường sẽ trông không khác gì các chữ cái Latin nhưng được máy tính xử lý như các ký tự khác nhau, cũng như xem chúng như các địa chỉ trang web hoàn toàn khác biệt.
Ví dụ, chữ “а” trong bảng chữ cái Cyrillic (U+430) và chữ “a” trong bảng chữ cái Latin (U+0041) đều được trình duyệt xử lý hoàn toàn khác biệt dù đều hiển thị là chữ “a” trong thanh địa chỉ trình duyệt.
Các cuộc tấn công giả mạo Punycode
Ở chế độ mặc định, các trình duyệt web sử dụng bộ mã hóa “Punycode” để biểu diễn các ký tự Unicode trong địa chỉ URL để chống lại các cuộc tấn công giả mạo loại ký tự. Punycode là một bộ mã hóa đặc biệt được trình duyệt web sử dụng để chuyển các ký tự Unicode thành bộ ký tự giới hạn của ASCII (từ A đến Z, từ 0 đến 9), hỗ trợ bởi hệ thống tên miền quốc tế International Domain Name (IDNs).


Ví dụ, tên miền Trung Quốc “.co” được biểu diễn trong dạng Punycode là “xn--s7y.co”.
Theo Zheng, lỗ hổng này dựa trên thực tế rằng các trình duyệt web dùng Punycode để biểu diễn các ký tự Unicode nếu các đường link URL chỉ sử dụng một ngôn ngữ duy nhất (ví dụ, chỉ dùng tiếng Trung Quốc hay chỉ dùng tiếng Nhật), nhưng các trình duyệt sẽ không thể biểu diễn được nếu tên miền chứa các ký tự từ nhiều loại ngôn ngữ khác nhau.
Lỗ hổng này cho phép các nhà nghiên cứu đăng ký một tên miền và vượt qua được lớp bảo vệ, khi nó hiển thị dưới cái tên “apple.com” với tất cả các trình duyệt bị ảnh hưởng, kể cả Chrome, Firefox và Opera, trong khi đó Internet Explorer, Microsoft Edge, Apple Safari, Brave và Vivaldi lại không bị tổn thương bởi kỹ thuật tấn công này.

Trình duyệt Vivaldi miễn nhiễm với kỹ thuật tấn công này.

Ở đây, tiền tố xn-- còn được gọi là tiền tố “bộ mã hóa tương thích ASCII”, để các trình duyệt web biết rằng, tên miền sử dụng bộ mã hóa Punycode để biểu diễn các ký tự Unicode. Nhưng bởi vì Zheng sử dụng chữ “a” trong bảng chữ cái Cyrillic (U+430) thay vì chữ “a” trong bảng chữ cái ASCII (U+0041), lớp bảo vệ này của trình duyệt đã bị đánh bại.
Vào tháng Một vừa qua, Zheng đã thông báo vấn đề này cho các nhà cung cấp trình duyệt bị ảnh hưởng, bao gồm cả Google Chrome và Mozilla Firefox.
Trong khi Mozilla Firefox hiện vẫn đang thảo luận để sửa chữa lỗi này, Google đã vá được lỗ hổng trong bản thử nghiệm Chrome Canary 59 của mình, và sẽ ra mắt một bản sửa lỗi vĩnh viễn với việc phát hành Chrome bản Stable 58, dự kiến sẽ ra mắt trong tháng này.
Trong khi đó, hàng triệu người dùng Internet, những người đang có nguy cơ trở thành nạn nhân của kỹ thuật tấn công giả mạo tinh vi, khó có thể phát hiện này, được khuyến cáo nên tắt chức năng Punycode trong trình duyệt web của mình để tạm thời giảm nhẹ loại tấn công này và xác định các tên miền giả mạo như vậy.
Cách giảm nhẹ cuộc tấn công với người dùng Firefox (không dành cho Chrome)


Người dùng Firefox có thể làm theo các bước dưới đây để áp dụng các biện pháp làm giảm nhẹ tạm thời với kỹ thuật tấn công nguy hiểm này:
- Gõ about:config vào thanh địa chỉ và ấn Enter.
- Gõ Punycode vào thanh tìm kiếm.
- Phần cài đặt của trình duyệt sẽ hiển thị thông số có tiêu đề: network.IDN_show_punycode, click đúp hoặc ấn chuột phải và chọn Toggle để thay đổi giá trị của thông số này, từ false sang true.
Thật không may, cách làm này không thể áp dụng cho Chrome hay Opera do không có các thiết lập tương tự để vô hiệu hóa chức năng chuyển đổi Punycode đối với đường link URL theo cách thủ công, vì vậy người dùng Chrome phải chờ thêm vài tuần nữa để nhận được bản vá khi bản Chrome Stable 58 phát hành.
Người dùng Internet luôn được khuyến khích nhập thủ công địa chỉ website, đặc biệt là các trang web quan trọng như Gmail, Facebook, Twitter, Yahoo hay các trang web ngân hàng, thay vì click vào bất kỳ đường link nào xuất hiện trên một số website hay email. Điều này cũng nhằm ngăn chặn các cuộc tấn công không thể phát hiện như trên.
Tham khảo The Hacker News

Maven java


If you use Maven to manage the dependencies in your Java project, you do not need to download; just place the following into your POM's <dependencies> section:
<dependency>
  <!-- jsoup HTML parser library @ http://jsoup.org/ -->
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.10.2</version>
</dependency>

Gradle

// jsoup HTML parser library @ http://jsoup.org/
compile 'org.jsoup:jsoup:1.10.2'

Parsing and traversing trong java (JSOUP)


Parse trong một đoạn HTML:
String html = "<html><head><title>Tài liệu đầu tiên về parse</title></head>"
  + "<body><p>Hãy học java.</p></body></html>";
Document doc = Jsoup.parse(html);
Kết quả:
Từ đây ta có thể truyền vào một link để đọc được bất kỳ trang web nào. Sau
đó thực hiện các thao tác sử lý để lấy những phần cần thiết trên trang.

Extract attributes, text, and HTML from elements


Problem

After parsing a document, and finding some elements, you'll want to get at the data inside those elements.

Solution

For example:
String html = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>";
Document doc = Jsoup.parse(html);
Element link = doc.select("a").first();
String text = doc.body().text(); // "An example link"
String linkHref = link.attr("href"); // "http://example.com/"
String linkText = link.text(); // "example""
String linkOuterH = link.outerHtml(); 
    // "<a href="http://example.com"><b>example</b></a>"
String linkInnerH = link.html(); // "<b>example</b>"

Description

The methods above are the core of the element data access methods. There are additional others:
  • Element.id()
  • Element.tagName()
  • Element.className() and Element.hasClass(String className)
All of these accessor methods have corresponding setter methods to change the data.

Những gì xảy ra tại Compile time?

Tại compile time (thời gian biên dịch), java file được biên dịch bởi Java Compiler (Nó không tương tác với OS) và chuyển đổi Java code thành Bytecode.

Điều gì xảy ra tại runtime?

Tại Runtime (thời gian biên dịch), các bước sau được thực hiện:

  • Classloader: Đây là hệ thống con của JVM được sử dụng để tải class file.
  • Bytecode Vertifier: Kiểm tra các đoạn code để xem có hay không các phần code không hợp lệ có truy cập không hợp lệ tới các đối tượng.
  • Interpreter: Đọc Bytecode Stream, sau đó thực thi các chỉ thị.

Câu hỏi: Bạn có thể lưu một source file bởi một tên khác ngoài tên lớp không?

Có, nếu lớp không phải là public. Bạn có thể theo dõi ở sơ đồ dưới:

  • Để biên dịch, gõ: javac Hard.java
  • Để thực thi, gõ: java Simple

Bạn có thể có nhiều lớp trong một source file không?

Có, sơ đồ sau minh họa điều này:

C# LÀ NGÔN NGỮ TUYỆT VỜI NHẤT. JAVA, PHP, C, C++, RUBY CHỈ TOÀN LÀ THỨ RẺ TIỀN


Sau một khoảng thời gian dài lập trình, mình đã có thể tự mà phát biểu rằng: C# là ngôn ngữ lập trình tuyệt vời và đáng học nhất. Lý do ư, vô số kể:
  • Bản thân ngôn ngữ C# có vô số điều thú vị: static method, partial class, delegate, LINQ, lambda expression, … Cái ngôn ngữ cùi bắp như Java làm gì có partial class, delegate, đến Java 8 mới bắt chước được cái lambda expression còn gì.
  • C# là ngôn ngữ strong-typed: Các tham số, kết quả trả về của hàm đều là một object. Mọi lỗi do đánh nhầm tên trường, tên hàm, nhầm kiểu class đều được báo trong lúc viết code, không phải chờ đến lúc chạy mới báo như mấy cái ngôn ngữ PHP, python cùi chuối khác.
  • C# đi kèm với framework .NET, hỗ trợ nhiều thứ: Tạo ứng dụng Window với WinForm, WPF; Tạo website bằng WebForm, MVC.NET… Mấy cái ngôn ngữ cấp thấp như C, C++ tuổi gì làm được mấy cái đó.
  • C# có IDE Visual Studio cùng nhiều plug-in vô cùng mạnh mẽ. VS ra bản mới đều đặn như FIFA. Reshaper hỗ trợ refactor, tăng tốc độ code … Mấy đứa khác code PHP, Python dùng cái gì để code? Dĩ nhiên là mấy thứ rởm rởm như Notepad++ hoặc Sublime Text rồi, đến cái chức năng “Jump to Definition” còn không có.
Đọc xong đoạn này, có lẽ sẽ có khoảng vài chục người ném cà chua, trứng thối và gạch đá đủ cho mình xây biệt thự. Từ từ, ít ra hãy bỏ thời gian kéo xuống dưới, đọc hết bài viết rồi ném gạch mình nhé. Dù sao khung comment nó nằm tận dưới cuối trang mà.

Chúng ta đang xem ngôn ngữ lập trình như một thứ tôn giáo

Ngày xưa, mình cũng hay nhảy vào ném gạch khi nghe có đứa mở mồm chê C# và .NET. Giữa lập trình viên với nhau luôn có những cuộc tranh cãi liên tu bất tận về ngôn ngữ và công nghệ: Ngôn ngữ nào mạnh nhất, công nghệ nào tốt nhất. Ngôn ngữ, thứ vốn chỉ là công cụ, nay được nâng lên tầm TÔN GIÁO. Lập trình viên chia thành đạo Java, đạo PHP, đạo C#, đạo này công kích chửi bới đạo kia. Mức độ cuồng tín đôi khi chắc cũng không thua fan bóng đá, fan cuồng K-pop hay ISIS. Những cuộc cãi vã chê bai đầy rẫy trên mạng, các bạn có thể thử google: Why C# sucks, Why Java sucks, Why PHP sucks, … để xem thử.
Khi làm việc nhiều với một ngôn ngữ, một developer sẽ quen dần với ngôn ngữ đó, tìm ra được nhiều điều hay ho ẩn trong ngôn ngữ. Nhiều người sẽ nghĩ rằng ngôn ngữ của mình là nhất, có thể giải quyết được mọi vấn đề (Giống như ISIS nghĩ rằng đạo Hồi là nhất, mọi lời nói của đấng tối cao đều đúng đắn). Khi ngôn ngữ mình thích bị chê bai, bị xúc phạm, họ cảm thấy như chính tôn giáo của mình bị xúc phạm. Họ xù lông lên, kêu gọi bạn bè, đồng đội cùng đạo, nhảy vào ném đá cho chết “cái thằng bố láo, dám chê Java, PHP, C++, … của bố“.

Về bản chất, ngôn ngữ chỉ là công cụ

Ngôn ngữ chỉ là thứ chúng ta sử dụng, nó không định hình nên con người chúng ta. Để mở rộng tầm nhìn, bạn hãy thử tìm hiểu nhiều ngôn ngữ xem. Bạn sẽ ngạc nhiên khi thấy giữa chúng đều có một vài khái niệm, khuôn mẫu chung. (Mình từng dùng MVC.NET, Struts2, Django, 3 framework của 3 ngôn ngữ khác nhau nhưng đều dựa trên khái niệm MVC cả). Nói một các công bằng, ngôn ngữ nào cũng có cái hay của nó:
  • C, C++ làm web khá cực và mất thời gian, nhưng để lập trình nhúng, lập trình game hay cần performance thì khó ai bằng nó.
  • Javascript là cái ngôn ngữ kì dị điên khùng và cực tệ. Tuy nhiên do có vô số framework đi kèm nên hiện tại và tương lai nó vẫn sẽ hot, do đó mình khuyên nhiều bạn nên học.
  • PHP được thiết kế dở tệ (Vốn nó được tạo ra chỉ để viết mấy trang web nho nhỏ), nhưng có vô số framework, cộng đồng lập trình viên đông và hung hãn. Nó là lựa chọn số 1 nếu muốn tạo 1 trang web nhanh, nhiều tính năng, ít lỗi (Điển hình như blog này viết trên wordpess, cũng viết bằng PHP).
  • C#.NET, muốn dùng phải cài 1 đống thứ nặng nề và tốn tiền. Nhưng nó lại được rất nhiều công ty sử dụng vì tính năng, bảo mật, v…v

Dừng tranh cãi lại, bớt gạch đá đi

Xét cho cùng, thứ quan trọng không phải là ngôn ngữ, mà là khả năng tư duy logic, kĩ năng giải quyết vấn đềtầm nhìn hệ thống. Khách hàng sẽ đánh giá chúng ta qua sản phẩm – thứ họ thấy, và éo ai quan tâm đến code bạn viết đâu. Bạn có ngừng dùng facebook vì nó viết bằng PHP – thứ ngôn ngữ cùi bắp không? KHÔNG. Bạn có bỏ stackoverflow khi biết nó được xây dựng dựa trên MVC.NET, ngôn ngữ vừa chậm vừa mắc tiền không? DĨ NHIÊN LÀ KHÔNG. Vậy thì hãy đánh giá một lập trình viên qua thứ họ làm ra, chứ đừng thông qua ngôn ngữ họ sử dụng.
Thay vì chê bai, tranh cãi khi có người chê ngôn ngữ mình thích, hãy bỏ thời gian ra tìm hiểu và chia sẻ kiến thức (Bằng cách viết blog như mình này).  Giữ một cái nhìn khách quan về ngôn ngữ lập trình, bạn sẽ dễ dàng thăng tiến, tìm việc hơn (Đang làm Java nhảy qua Python cũng không sao). Ngày xưa mình cũng ghét PHP lắm, sau khi tự học nó lại thấy nó có kha khá thứ thú vị đấy chứ.
Kết luận: Nói gì thì nói, bản chất PHP vẫn là một ngôn ngữ sida cùi bắp, và Javascript vẫn là cái thứ dị hợm, dở dở ương ương, thất bại của tạo hóa. Nếu bạn vẫn còn cay cú vì PHP bị nói xấu, vui lòng kéo lên đầu và đọc lại bài viết nhé :D.
Nguồn: toidicodedao.com

How to Run Java Application


Now that your  Java file is compiled we can execute the application using the “java” command as below.
Without Package
With Package
Or

Note*: The “java” command uses the class file name without its extension(.class).
With this we are done creating and running our very first Java application.
In the next section we will learn the difference between JDK and JRE.