2011-09-08 30 views
15

Câu hỏi này đã được đặt ra vài lần ở nhiều nơi, nhưng tôi chưa tìm thấy câu trả lời rõ ràng và rõ ràng. Hầu hết các giải pháp liên quan đến những người nói rằng để vô hiệu hóa Magic Quotes trên tập tin php.ini (mà tôi đã làm) hoặc sửa đổi các tập tin WP cốt lõi.

Dù sao thì, câu hỏi đặt ra là: tại sao mỗi lần tôi sử dụng $ wpdb-> insert hoặc $ wpdb-> update một dấu gạch chéo được thêm vào trước bất kỳ trích dẫn nào. Vì vậy, ví dụ:

Tôi đã ăn dâu tây trở thành tôi \ đã dâu tây

Dưới đây là một số mẫu mã tôi đã sử dụng ăn:

$id = $_POST['id']; 
$title = $_POST['title']; 
$message = $_POST['message']; 

$wpdb->update('table_name', array('id'=>$id, 'title'=>$title, 'message'=>$message), array('id'=>$id)) 

Vấn đề tương tự cũng được tại đây: Wordpress Database Output - Remove SQL Injection Escapes nhưng chưa bao giờ được giải quyết ngoài "vô hiệu hóa các trích dẫn kỳ diệu"

+0

Bạn có chắc bạn đã báo giá ảo thuật vô hiệu hóa? Bạn đã kiểm tra nó trong 'phpinfo()' – zerkms

+0

Yea, đây là đoạn trích từ phpinfo -> magic_quotes_gpc \t Tắt \t Tắt magic_quotes_runtime \t Tắt \t Tắt magic_quotes_sybase \t Tắt \t Tắt –

+0

có những phụ/thiếu dấu ngoặc kép trong ' update() 'gọi lỗi chính tả hoặc thực sự trong mã của bạn? – Phil

Trả lời

39

Sau khi dành cả ngày vào ngày này, câu trả lời là như sau:

Wordpress thoát tại khai báo $ _POST, không phải ở lần chèn thực tế, kỳ lạ.

$id = stripslashes_deep($_POST['id']); //added stripslashes_deep which removes WP escaping. 
$title = stripslashes_deep($_POST['title']); 
$message = stripslashes_deep($_POST['message']); 

$wpdb->update('table_name', array('id'=>$id, 'title'=>$title, 'message'=>$message), array('id'=>$id)); 

Làm điều này có nghĩa là WP sẽ không thêm dấu gạch chéo trước bất kỳ dấu ngoặc kép nào.

+0

Rất tiện dụng! Cảm ơn! – geilt

+3

Trình tiết kiệm cuộc sống. Cảm ơn @J Lee. Điều này chắc chắn sẽ mất một thời gian để gỡ lỗi nếu điều này không có ở đây. – Nick

+0

nó hoạt động tốt .... cảm ơn buddy – kuldipem

5

thông tin thêm một chút - WordPress đã quyết định khiến mọi người nghĩ rằng họ sẽ phát điên bằng cách thêm 'dấu ngoặc kép' ngay cả khi bạn đã tắt tính năng này bắt đầu từ phiên bản 3.0. Mọi quyền truy cập vào $ _REQUEST, $ _GET, $ _POST, $ _COOKIE hoặc $ _SERVER sẽ bị ảnh hưởng. Xem wp-includes/load.php.

/* Add magic quotes to $_GET, $_POST, $_COOKIE, and $_SERVER. 
* @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); 
} 
2

WordPress bỏ qua việc xây dựng trong php báo giá ảo thuật thiết lập và giá trị của get_magic_quotes_gpc() và sẽ luôn luôn thêm dấu ngoặc kép ma thuật (ngay cả sau khi tính năng được lấy ra từ PHP 5.4).

bạn có thể sử dụng thay vì

//replace $_POST with $POST 
$POST  = array_map('stripslashes_deep', $_POST); 
$wpdb->insert( 
     'wp_mytable', 
     array( 
      'field_name'  => $POST['field_name'], 
      'type'    => $POST['type'], 
      'values'   => serialize($POST['values']), 
      'unanswered_link' => $POST['unanswered_link'], 
     ), 
     array( 
      '%s','%s','%s','%s' 
     ) 
    ); 

WordPress thực hiện điều này vì quá nhiều lõi và mã plugin đã đến dựa vào các dấu ngoặc kép là có, vì vậy việc vô hiệu hóa dấu ngoặc kép trên siêu globals (như được thực hiện trong cả ví dụ "Ví dụ cơ bản" và "Mã hóa tốt Thực tiễn" ở trên) có khả năng gây ra lỗ hổng bảo mật.

http://codex.wordpress.org/Function_Reference/stripslashes_deep

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