Lỗi link src=”%5C” khi dùng TinyMCE và HTML Purifier (hoặc các thư viện tương tự)

Giả sử bạn đang lập trình PHP có sử dụng TinyMCE (hoặc các editor tương đương) và có sử dụng các thư viện lọc kí tự, như HTML purifier, nếu người dùng chèn vào một hình ảnh, bạn mong muốn link hình sẽ được lưu đúng vào cơ sở dữ liệu, ví dụ:

<img src="/upload/abc.jpg" alt="test"/>

Nhưng với một số host, có thể bạn sẽ nhận được dữ liệu như dưới đây:

<img src="%5C" alt="\"test\"" />

Và như vậy, hình ảnh không thể hiện đúng ra giao diện người dùng.

Lí do xảy ra việc trên là vì cấu hình magic_quotes_gpc của PHP.

magic_quote_gpc hoạt động tương tự như hàm addslashes(). Đây là một cấu hình giúp tự động thêm ký tự escape vào trước các ký tự đặc biệt như: nháy đơn (‘), nháy kép (“), dấu backslash (\) khi nó được POST hoặc GET từ client lên, mục đích là để tránh lỗi SQL Injection.

Vậy để tránh lỗi trên, bạn chỉ việc tắt cấu hình magic_quote_gpc trong PHP là xong.

Tuy nhiên, nếu bạn đang sử dụng host share như GoDaddy chẳng hạn, bạn khó có thể yêu cầu tắt magic_quote_gpc được. Sau khi search trên web và tham khảo, mình chọn được cách giải quyết là dùng đoạn mã sau từ php.net.

if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}

Tác giả dùng nó như một cách để tắt magic_quote_gpc lúc thực thi. Ngoài cách trên, bạn cũng còn có thể sử dụng nhiều cách khác. Hãy search trên Google nếu bạn không thích dùng cách này.

Tags:

Bình luận

Bình luận Facebook

lời bình luận