Wordpress và trích dẫn ma thuật


12

Tôi đã viết một số plugin Wordpress và tôi đã gặp một số vấn đề với Wordpress khi đưa các trích dẫn ma thuật vào dữ liệu POST và GET.

Cụ thể, hàm "wp_magic_quotes" trong \ wp-gồm \ load.php, được gọi (có lẽ là trên mỗi phản hồi) trong wp-settings.php. Hàm này thêm các trích dẫn ma thuật vào dữ liệu ngay cả khi tôi tắt các trích dẫn ma thuật trong cài đặt PHP.

/**
 * Add magic quotes to $_GET, $_POST, $_COOKIE, and $_SERVER.
 *
 * Also forces $_REQUEST to be $_GET + $_POST. If $_SERVER, $_COOKIE,
 * or $_ENV are needed, use those superglobals directly.
 *
 * @access private
 * @since 3.0.0
 */
function wp_magic_quotes() {
    // If already slashed, strip.
    if ( get_magic_quotes_gpc() ) {
        $_GET    = stripslashes_deep( $_GET    );
        $_POST   = stripslashes_deep( $_POST   );
        $_COOKIE = stripslashes_deep( $_COOKIE );
    }

    // Escape with wpdb.
    $_GET    = add_magic_quotes( $_GET    );
    $_POST   = add_magic_quotes( $_POST   );
    $_COOKIE = add_magic_quotes( $_COOKIE );
    $_SERVER = add_magic_quotes( $_SERVER );

    // Force REQUEST to be GET + POST.
    $_REQUEST = array_merge( $_GET, $_POST );
}

Tôi có an toàn không khi chỉ nhận xét cuộc gọi wp_magic_quotes () trong wp-settings.php? Đó là, nó sẽ ảnh hưởng tiêu cực đến mã Wordpress bình thường và / hoặc mở ra một số vectơ khai thác? Nếu vậy, có một số cách khác để làm điều đó ngoài việc sửa đổi mã WP (vì vậy tôi không phải đối phó với điều này mỗi khi có bản cập nhật)?


Bất cứ ai có thể cho tôi biết, nơi / khi chức năng wp_magic_quotes()được thực hiện? Tôi không thể tìm thấy sự thực thi trong wp-core.
T.Todua


Vấn đề này vẫn tồn tại vào năm 2019, hơn 8 năm sau (ví dụ với PHP 7.1.33 (2019-10-23) và WordPress 5.2.4 (2019-10-14)).
Peter Mortensen

Câu trả lời:


8

Đơn giản chỉ cần đặt WP biến tình huống không xác định (trích dẫn ma thuật có thể hoặc không thể được bật trong cấu hình máy chủ) thành xác định (báo giá ma thuật luôn luôn có mặt và cấu hình máy chủ không thành vấn đề).

Thay vì gây rối với điều này cho tất cả lõi WP, sẽ đơn giản hơn nhiều nếu chỉ cắt các dấu gạch chéo trong mã của bạn trên các biến của riêng bạn, khi bạn cần điều đó.


7
Điều này là điên rồ, nếu tôi có thể. Trích dẫn ma thuật được coi là xấu bởi bất kỳ lập trình viên lành mạnh nào, và đây là một lựa chọn thực sự vô trách nhiệm của Wordpress. Không phải là tôi ngạc nhiên.
o0 '.

5
@Lohoris lưu ý rằng WP không chỉ tồn tại ở đây và bây giờ. Nó tồn tại khoảng thời gian nhiều năm. Nếu trích dẫn ma thuật vốn là ý tưởng tồi tệ hơn thì chúng sẽ không tồn tại ở nơi đầu tiên. Trong khi thời gian thay đổi và thật dễ dàng để hét lên ý tưởng tồi tệ như thế nào bây giờ - thay đổi hành vi hiện có trong cơ sở mã đi kèm với bảo mật lớn và ý nghĩa tương thích ngược.
Hết

3

Hành vi hiện tại trong WordPress là cách thực hành tốt nhất dựa trên tính tương thích của tất cả các hệ thống và cấu hình PHP. WordPress đã luôn bình thường hóa $ _GET, $ _POST, $ _COOKIE và $ _SERVER để được cắt giảm và mong rằng nó sẽ tiếp tục như vậy.

Vì vậy, để trích xuất một tham số POST hoặc GET, chúng ta phải viết:

$value = stripslashes_deep($_POST['name']); hoặc là

$value = stripslashes_deep($_GET['name']);


0

Tôi đã viết một giải pháp để xử lý các mảng siêu lớp này trong một câu hỏi tương tự trong Stack Overflow.

Nó bao gồm viết một "phương thức truy cập" duy nhất (get / set) cho mỗi superglobal, slashing và tước trong suốt. Vì vậy, bạn sẽ sử dụng, ví dụ:

echo _get('username');    // echo stripslashes_deep($_GET['username']);
_cookie('name', 'value'); // $_COOKIE['name'] = addslashes_deep('value');

Bằng cách này, bạn có thể kiềm chế không gây rối hơn nữa với các siêu lớp và tận hưởng một giải pháp sẽ hoạt động "cục bộ" cho mã của bạn, mà không có bất kỳ tác dụng phụ nào. Đối với tôi, đó là giải pháp cuối cùng.


-3

Gần đây tôi đã có vấn đề này, và cuối cùng tôi đã tìm ra nó. Về cơ bản, tôi đã tìm kiếm gần như mọi trang web về các trích dẫn ma thuật trên WordPress và không ai trong số họ giúp đỡ.

Đây là cách khắc phục:

  1. Đi vào wp-settings.php của bạn

  2. Tìm kiếm wp_magic_quotes ();

  3. Chỉ cần bình luận và nó sẽ hoạt động ngay bây giờ

Điều này hoạt động bởi vì nếu bạn xem trước mã đó, bạn sẽ thấy:

// Disable magic quotes at runtime. Magic quotes are added using wpdb later in //wp-settings.php.

@ini_set( 'magic_quotes_runtime', 0 );
@ini_set( 'magic_quotes_sybase',  0 );

Các trích dẫn Magic được thêm vào sau này khi sử dụng wpdb là điều khiến hầu hết mọi người rối tung lên và nó xảy ra là wp_magic_quotes (). Chỉ cần bình luận rằng sẽ ngăn chặn các trích dẫn ma thuật làm phiền bạn.


6
Ý tưởng tồi: sau lần nâng cấp tiếp theo, thay đổi này bị mất.
fuxia

Rõ ràng đây là một ý tưởng tồi ™, đây là giải pháp duy nhất mà tôi đã tìm thấy để chạy đồng thời WordPress và Magento mà không gặp sự cố Magento khi lưu nội dung.
forsvunnet 17/2/2015

1
Đây cũng là một ý tưởng tồi vì nhiều plugin được viết sai và không thoát SQL chính xác để trang web của bạn có thể trở nên dễ bị tấn công SQL. Và bất kỳ plugin nào thực hiện đúng cách bằng cách chạy dải phân cách / dải phân cách trên $ _GET / $ _ POST sẽ làm hỏng đầu vào của người dùng bằng cách xóa dấu gạch chéo ngược.
tomdxw
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.