2012-12-23 31 views
12

PayPal của mã mẫu cho một người biết lắng nghe PHP IPN có nhận xét này/code ở đầu trang:Các vấn đề serialization POST nào ví dụ về PayPal IPN của PHP đề cập đến?

// reading posted data from directly from $_POST causes serialization 
// issues with array data in POST 
// reading raw POST data from input stream instead. 
$raw_post_data = file_get_contents('php://input'); 
$raw_post_array = explode('&', $raw_post_data); 
$myPost = array(); 
foreach ($raw_post_array as $keyval) { 
    $keyval = explode ('=', $keyval); 
    if (count($keyval) == 2) 
    $myPost[$keyval[0]] = urldecode($keyval[1]); 
} 

Ai đó có thể giải thích những vấn đề serialization nhận xét này đề cập đến? Trong khi tôi làm điều đó theo cách này, tôi sẽ cảm thấy thoải mái hơn khi biết tại sao nó phải được thực hiện theo cách này.

+0

Không chắc chắn điều này có nghĩa là gì trong ngữ cảnh, nhưng '$ _POST' không phải lúc nào cũng chứa cùng một thứ như' php: // input'. Ví dụ: 'key = val1 & key = val2' sẽ chỉ dẫn đến một mục nhập cho' khóa' trong mảng '$ _POST'. Ngoài ra, 'php: // input' là chỉ đọc trong khi' $ _POST' thì không. –

+0

Nhìn vào một trang thử nghiệm mà tôi đưa lên, chắc chắn rằng '$ raw_post_array' sẽ chứa cả hai mục' khóa', trong một mảng được lập chỉ mục. Tuy nhiên, phần còn lại của mã mẫu kết thúc phân tích cú pháp dữ liệu thô thành một mảng. So sánh hai mảng, các mảng '$ myPost' tùy chỉnh của chúng giống hệt' $ _POST'. tức là: giữ nguyên khai báo lần cuối '$ key = 'val2''. –

+0

Tại sao trong thế giới * họ làm điều đó thay vì chỉ sử dụng ['parse_str'] (http://php.net/parse_str)? Có thể họ đang đề cập đến một cái gì đó kỳ lạ mà nó không? Nó sử dụng cùng một mã tạo ra '$ _GET' và' $ _POST' sau tất cả ... – Charles

Trả lời

11

Tôi không thể cho bạn biết động lực của người trả tiền, nhưng tôi có thể đoán: php thích thay đổi khóa của biến đến từ yêu cầu http.

Ví dụ: tên a.b [ sẽ hiển thị là $_POST['a_b__']. php sẽ thay thế dấu cách, dấu chấm và dấu ngoặc mở bằng dấu gạch dưới: nguồn: http://php.net/manual/en/language.variables.external.php

Ngoài ra, php sẽ phân tích cú pháp dấu ngoặc vuông được tạo thành trong tên biến thành mảng lồng nhau. ví dụ: arr[a][b] sẽ hiển thị là $_POST['a']['b']. http://php.net/manual/en/faq.html.php#faq.html.arrays

Ngoài ra, php xử tất cả các loại điên và lỗi khi khung được không cũng được hình thành: https://bugs.php.net/bug.php?id=48597

Ngoài ra, magic_quotes_gpc sử dụng để có móng vuốt của nó vào mỗi cài đặt php, thay đổi tên của các biến trong một số trường hợp quá. http://php.net/manual/en/security.magicquotes.php

Ngoài ra, php có cài đặt arg_seperator.input và một số người muốn đặt cài đặt này thành & thay vì chỉ &. Paypal không thể biết mà bạn thích, và sẽ rõ ràng là luôn luôn sử dụng & http://php.net/manual/en/ini.core.php#ini.arg-separator.input

Ngoài ra, mặc dù là xấu thực tế, nó không quá phổ biến trong php cho mã/thư viện để tự động thay đổi các đầu vào yêu cầu như $_POST, ví dụ như để XSS " khử trùng "chúng hoặc các mối quan tâm cắt ngang khác.

Bằng cách phân tích cú pháp đầu vào theo cách thủ công, bạn tránh tất cả các vấn đề tiềm ẩn đó. Quyết định này có vẻ như kỹ thuật tốt về phía họ.

+2

Câu trả lời tuyệt vời. Cảm ơn bạn đã tham khảo! –

+0

Câu trả lời hay. Làm cho cảm giác bây giờ. –

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