2010-03-22 32 views
33

Khi tập lệnh PHP của tôi nhận dữ liệu từ yêu cầu AJAX POST, các biến số $_POST được thoát. Điều thực sự lạ là điều này chỉ xảy ra trên máy chủ sản xuất của tôi (chạy PHP 5.2.12 trên Linux) chứ không phải trên máy chủ cục bộ của tôi (chạy PHP 5.3.1 trên Windows).

Đây là mã AJAX:

var pageRequest = false; 
if(window.XMLHttpRequest)  pageRequest = new XMLHttpRequest(); 
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP"); 

pageRequest.onreadystatechange = function() { } 

var q_str = 'data=' + " ' "; 

pageRequest.open('POST','unnamed_page.php',true); 

pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
pageRequest.setRequestHeader("Content-length", q_str.length); 
pageRequest.setRequestHeader("Connection", "close"); 

pageRequest.send(q_str); 

Có bất kỳ lý do này đang xảy ra? Và làm thế nào tôi nên sửa lỗi này để nó hoạt động trên cả hai máy chủ?

Edit: Tôi có cài đặt sau cho magic_quotes:

     Local Master 

magic_quotes_gpc  On  On 
magic_quotes_runtime Off  Off 
magic_quotes_sybase Off  Off 

Trả lời

61

Bạn có lẽ đã báo giá ảo thuật kích hoạt trên máy chủ Linux: magic_quotes

Khi magic_quotes đang ở trên, tất cả '(single-quote), "(dấu ngoặc kép), \ (backslash) và NUL được tự động thoát bằng dấu gạch chéo ngược.

Chúng là một điều tốt để vô hiệu hóa vì chúng sẽ bị xóa khỏi PHP 6 trở đi. Bạn cũng có thể vô hiệu hóa chúng bên trong tập lệnh của mình: set-magic-quotes-runtime Bạn không thể hủy kích hoạt phần magic_quotes chịu trách nhiệm thoát dữ liệu POST trong thời gian chạy. Nếu bạn có thể, hãy tắt nó trong php.ini. Nếu bạn không thể làm điều đó, làm một kiểm tra xem magic_quotes được kích hoạt, và làm một stripslashes() trên bất kỳ nội dung nào bạn lấy từ POST:

if (get_magic_quotes_gpc()) 
$my_post_var = stripslashes($_POST["my_post_var"]); 
+0

Và điều này sẽ không làm hỏng địa phương của tôi Chỉ cần muốn đảm bảo tôi nhận được điều này ... –

+0

@George nếu bạn thực hiện kiểm tra như được mô tả, nó sẽ hoạt động với máy chủ cục bộ của bạn, vì 'get_magic_quotes_gpc()' sẽ trả về false và không có dấu gạch chéo nào bị tước. Hãy thử nó ra, làm một đầu ra thử nghiệm của chức năng.Nhưng điều tốt nhất thực sự là để vô hiệu hóa dấu ngoặc kép ma thuật trên máy linux.Bạn có thể làm một 'phpinfo()', nó sẽ cho bạn biết những gì được kích hoạt và những gì không phải là –

+1

@George đây là biện pháp bảo mật để ngăn chặn việc tiêm SQL bằng cách tự động thoát khỏi dữ liệu có liên quan bằng dấu gạch chéo. trên, và cuối cùng trở thành một mối phiền toái cũng được minh họa bởi trường hợp của bạn. –

2

lẽ php.ini máy chủ Linux của bạn đã báo giá ảo thuật kích hoạt.

http://php.net/manual/en/security.magicquotes.php

này là xấu tất nhiên, như các chức năng bị phản đối và sẽ được loại bỏ trong PHP sắp tới 6.

Bạn có thể vô hiệu hóa nó trong php.ini như vậy

magic_quotes_gpc = Off 

Bạn có thể kiểm tra và vô hiệu hóa nó trong thời gian chạy nếu bạn không thể truy cập vào php.ini

<?php 
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ừ PHP Manual

+0

Làm cách nào tôi có thể sửa lỗi này? Tôi không thể chỉnh sửa php.ini trên máy chủ sản xuất. –

+0

Kiểm tra ví dụ mã hoặc nhấp qua liên kết thủ công để đọc thêm. – alex

4

Có thể sẽ có báo giá ảo thuật bật trong môi trường sản xuất của bạn. Kiểm tra đầu ra phpinfo().

Bạn có thể chạy tất cả các yếu tố đầu vào của bạn thông qua một cái gì đó như thế này để tước có dấu ngoặc kép:

 /* strip slashes from the string if magic quotes are on */ 
    static function strip_magic_slashes($str) 
    { 
      return get_magic_quotes_gpc() ? stripslashes($str) : $str; 
    } 
+1

Tôi đã kiểm tra phpinfo(): chắc chắn đủ, nó đã được kích hoạt trên máy chủ sản xuất. –

25

Tôi không nghĩ rằng đây áp dụng trong trường hợp của bạn, nhưng tôi đã chỉ có một vấn đề tương tự. Tôi đang tải một cài đặt Wordpress cùng với một trang web để tôi có thể hiển thị các bài đăng gần đây trên tất cả các trang.Hóa ra Wordpress đã thoát khỏi tất cả các $ _POST vars, bất kể magic_quotes được đặt là gì.

Tôi đề cập đến nó bởi vì nó là bực bội để tìm ra, và googling cho một câu trả lời mang lại cho tôi ở đây.

Đây là cách tôi cố định nó trong trường hợp của tôi:

$temp_POST = $_POST; 
require '../www/wp_dir/wp-load.php'; // loading wordpress 
$_POST = $temp_POST;
+0

Sau 3 năm, nó vẫn chưa được gắn trong WP 3.7. – biziclop

+1

Có thể đó là một tính năng chứ không phải lỗi. Trong tệp wp-settings.php, phương thức wp_magic_quotes() được gọi được định nghĩa trong wp-includes/load.php. Phương thức này đảm bảo rằng bên trong WordPress tất cả các tham số được trích dẫn bất kể Magic Quotes. –

+2

Tôi nghĩ rằng một mô tả chính xác hơn là "ai đó dự định nó như là một tính năng nhưng không nghĩ đến hậu quả vì vậy bây giờ nó là một lỗi cho người khác" Có thể dễ dàng tránh được bằng cách sao chép các tập tin POST để sử dụng riêng và sau đó thoát chúng ở đó, thay vì thay đổi những gì thực sự trong POST, nơi mọi thứ bên ngoài wordpress phải đối phó với những thay đổi. –

0

Vì vậy, tôi đã nói chuyện với một dev wordpress (https://core.trac.wordpress.org/ticket/40476#ticket) và ông nói:

"Trở lại trong ngày, nhiều nhiều vệ tinh trước đây, Sau khi PHP đã chấp nhận rằng tất cả các giá trị superglobal nên được cắt giảm PHP sau đó đã đảo ngược ý tưởng về một cái gì đó sane mà bạn thấy ngày hôm nay, nhưng thiệt hại đã được thực hiện, WordPress như một ứng dụng đã tồn tại đủ lâu, và có đủ plugin và chủ đề hiện có dựa trên WordPress tạo ra một enviro đơn nment rằng WordPress cũng thay đổi sẽ gây ra thiệt hại không thể khắc phục cho các trang web - giới thiệu lỗ hổng bảo mật, nội dung mangle, và một loạt những điều thú vị khác. https://core.trac.wordpress.org/ticket/18322 là vé của chúng tôi để theo dõi điều này và nhận được điều gì đó lành mạnh hơn - trong ngắn hạn (và thuật ngữ dài hơn), chúng tôi yêu cầu nếu bạn đang truy cập các biến $ _POST bạn làm như vậy: $ myvar = wp_unslash ($ _POST [ 'biến']); để một ngày, chúng tôi sẽ có thể có $ _POST như một mảng chưa được đánh dấu.

liên quan đến câu trả lời đưa ra ở đây:

$temp_POST = $_POST; 
require '../www/wp_dir/wp-load.php'; 
$_POST = $temp_POST; 

Xin đừng làm điều đó. Bạn chỉ cần mở chính mình cho các vấn đề bảo mật và những điều bất ngờ xảy ra với nội dung của bạn, nơi WordPress mong đợi các giá trị bị cắt giảm. Thay vào đó, chỉ cần sử dụng wp_unslash() và nếu bạn thực sự cần một bản sao $ _POST để hoạt động trên chính mình, hãy thực hiện như sau: $my_POST = wp_unslash($_POST);. Tôi cũng nên thêm - Tôi hy vọng bạn đang làm điều này bởi vì bạn đang cố gắng sử dụng điểm cuối API cho một thứ gì đó, tôi khuyên bạn nên chuyển sang sử dụng REST API được giới thiệu với WordPress 4.7 thay vào đó, vì nó cho phép chúng tôi để cung cấp trải nghiệm nhất quán hơn nhiều cho nhà phát triển. "

Các vấn đề liên quan