LỌC CÁC KÝ TỰ ĐẶC BIỆT

Một phần của tài liệu Giáo trình lập trình Web với Servlet và JSP - Đặng Thanh Dũng (Trang 73 - 76)

Chương 6 : XỬ LÝ YÊU CẦU TỪ CLIENT – FORM DATA

6.4.LỌC CÁC KÝ TỰ ĐẶC BIỆT

Trong hầu hết các trường hợp, rất dễ dàng để tìm ra các ký tự đặc biệt và thay thế theo các chuẩn của HTML. Tuy nhiên, có hai trường hợp không dễ thay thế:

(1) Chuỗi lấy từ một đoạn chương trình hoặc một nguồn nào đó được quy định sẵn bởi một định dạng chuẩn. Tìm từng ký tự và thay thế một cách thủ công là một cách giải quyết cho trường hợp này, tuy nhiên, nếu quên dù chỉ một ký tự cũng dẫn đến trường hợp trang web có một phần bị thiếu hoặc có định dạng không đúng.

(2) Chuỗi được lấy từ dữ liệu dạng HTML. Ở đây, việc chuyển đổi hoàn toàn phải được thực hiện trong thời gian chạy, vì chúng ta không biết các dữ liệu truy vấn lúc biên dịch. Nếu người dùng vô tình hoặc cố ý xâm nhập vào các thẻ HTML, trang web được tạo ra sẽ chứa các thẻ HTML khác nhau và có thể có kết quả hoàn toàn không thể đoán trước.

Cách tiếp cận để giải quyết bài toán này là sử dụng code. Việc thay thế các ký tự < , >, “, & trong chuỗi là một vấn đề đơn giản, có nhiều cách giải quyết. Tuy nhiên, cần lưu ý rằng chuỗi trong Java là

không thay đổi (không thể chỉnh sửa), vì vậy các tác động lên chuỗi (cộng chuỗi) liên quan đến việc tạo chuỗi copy:

String s1 = "Hello"; String s2 = s1 + " World";

Trong ví dụ trên, do không thể chỉnh sửa trực tiếp trên chuỗi s1, cho nên ta phải tạo một bản coppy của s1 rồi nối chuỗi “World” vào . Để tránh việc tạo quá nhiều copy (chiếm bộ nhớ quá nhiều), chúng ta nên sử dụng StringBuffer .

Ví dụ dưới đây trình bày phương thức filter, sử dụng StringBuffer để copy ký tự từ một chuỗi sang chuỗi kết quả (chuỗi đã lọc) một cách hiệu quả.

Bảng 6.1 - ServletUtility.java

package coreservlets;

import javax.servlet.*;

import javax.servlet.http.*;

public class ServletUtilities { ...

/** Thay các ký tự đặc. */

public static String filter(String input) { if (!hasSpecialChars(input)) {

return(input); }

StringBuffer filtered = new

StringBuffer(input.length()); char c;

for(int i=0; i<input.length(); i++) { c = input.charAt(i);

switch(c) {

case

'<':filtered.append("&lt;"); break;

case

'>':filtered.append("&gt;"); break;

case

'"':filtered.append("&quot;"); break;

case

'&':filtered.append("&amp;"); break;

default: filtered.append(c); }

}

return(filtered.toString()); }

private static boolean hasSpecialChars(String input) {

boolean flag = false;

if ((input != null) && (input.length() > 0)) {

char c;

for(int i=0; i<input.length(); i++) { c = input.charAt(i);

switch(c) {

case '<': flag = true; break;

case '>': flag = true; break;

case '"': flag = true; break;

case '&': flag = true; break; } } } return(flag); } }

Một phần của tài liệu Giáo trình lập trình Web với Servlet và JSP - Đặng Thanh Dũng (Trang 73 - 76)