2009-12-11 46 views
13

Tôi vừa mới biết được rằng có thể đưa mảng vào các biến PHP GET để thực hiện thực thi mã?PHP GET biến mảng biến

.php?a[]=asd&a[]=asdasd&b[]=$a

Đó là ví dụ tôi đã được đưa ra. Tôi không có ý tưởng làm thế nào nó hoạt động và đã tự hỏi nếu điều này thậm chí có thể?

+3

Chào mừng bạn đến StackOverflow, Samsung. Hãy để tôi là người đầu tiên trao cho bạn 12 điểm danh tiếng;) – Sampson

Trả lời

0

Ai đó nói dối bạn, bạn sẽ không thực hiện bất cứ điều gì với điều đó, bạn sẽ chỉ gửi một mảng thay vì một biến đơn giản.

thử mã này

<?php 
    $x = $_GET['x']; 
    var_dump($x); 
?> 

và truy cập nó bằng cách sử? X = 1 và sau đó? X [a] = 1 & x [b] = 2 nó dự kiến ​​hành vi, không tiêm và bạn không thể chạy bất kỳ mã nào với nó.

8

PHP sẽ phân tích chuỗi truy vấn, và tiêm những giá trị trong mảng $_GET siêu toàn cầu (tương tự cho $_POST nếu điều này đã được thực hiện trong một hình thức sử dụng POST, btw).

Trong trường hợp của bạn, các mảng $_GET sẽ chứa này:

array 
    'a' => 
    array 
     0 => string 'asd' (length=3) 
     1 => string 'asdasd' (length=6) 
    'b' => 
    array 
     0 => string '$a' (length=2) 

Mỗi giá trị thông qua trong chuỗi truy vấn sẽ được đưa bằng PHP trong mảng $_GET, tạo tiểu mảng nếu cần thiết, khi có [] được sử dụng trong chuỗi truy vấn.

Nhưng điều này không gây ra bất kỳ loại "thực thi mã": miễn là bạn xử lý nhập đúng cách (nghĩa là không tin tưởng đầu vào và sử dụng eval trên đó hoặc bất kỳ ý tưởng tồi nào như thế này), không có nguy cơ bị tiêm mã.

+0

Cảm ơn bạn đã cung cấp phản hồi toàn diện cho người hỏi, Pascal. Nó tạo ra một môi trường tốt hơn nhiều ở đây. – Sampson

+0

@ Jonathan: Cảm ơn :-) ;; chỉ cố gắng giúp đỡ; hy vọng nó làm ^^; Tôi cho rằng đó là cách của tôi "trả lại" –

2
echo $_GET['a'][0]; //prints "asd" 
echo $_GET['a'][1]; //prints "asdasd" 
echo $_GET['b'][0]; //prints "$a" 
1

Có vẻ như bạn đã hiểu nhầm điều gì đó.

Ví dụ trên chỉ đơn giản là tạo ra một mảng như

Array (
    [a] => Array (
    [0] => asd 
    [1] => asdasd 
) 
    [b] => Array ([0] => $a) 
) 

này được ghi chép lại và hoạt động chính xác như dự định.

2

Ở trên không nghiêm chỉnh cho phép thực thi mã, nhưng nó có thể thay đổi luồng điều khiển của mã hiện tại của bạn nếu nó không tính đến dữ liệu có thể là một mảng.

Lý do các tác phẩm trên là do PHP diễn giải các biến kết thúc bằng [] dưới dạng mảng. Vì vậy, nếu bạn cung cấp nhiều biến GET với cùng tên kết thúc bằng [], PHP sẽ tạo một mảng chứa tất cả các giá trị.

2

Ngắn câu chuyện: không thực thi mã. Nếu không, bạn có nghĩ rằng ai đó đã tấn công Facebook rồi không? Tôi nghĩ rằng người đã nói với bạn rằng đã bị nhầm lẫn về một số lỗi khác đã sử dụng mảng sâu làm tổ để kích hoạt một bộ đệm tràn/đôi miễn phí/một số vector hack khác, về mặt lý thuyết có thể được sử dụng để thực thi một số mã. Đó là những lỗi phần mềm như bạn có thể thấy hàng ngày trong nhiều phần mềm phổ biến. Chúng thường được vá nhanh chóng.

Bạn có thể tìm thêm thông tin tại http://www.suspekt.org/

5

Nếu bạn không chắc chắn làm thế nào để an toàn, ít nhất bạn có thể làm là để lọc các mảng $ _GET. Dưới đây là các chức năng:

function filter_url($url) 
{ 
    if (is_array($url)) 
    { 
    foreach ($url as $key => $value) 
    { 
     // recurssion 
     $url[$key] = filter_url($value); 
    } 
    return $url; 
    } 
    else 
    { 
    // remove everything except for a-zA-Z0-9_.-&= 
    $url = preg_replace('/[^a-zA-Z0-9_\.\-&=]/', '', $url); 
    return $url; 
    } 
} 

Bây giờ bạn có thể lọc $ _GET như thế này:

$_GET = filter_url($_GET); 

này về cơ bản sẽ dọn sạch mảng $ _GET của bạn từ những nhân vật đáng ngờ như [].

Cảm ơn

+0

Nó đã được hoàn hảo và giải quyết vấn đề của tôi ... Cảm ơn bạn. Nếu bạn muốn biết, tôi đã tiêm trên trang web của tôi và sử dụng "mysqli_real_escape", đã chặn tiêm, nhưng cũng ngăn chặn các chức năng trang web để wokr ... nhưng bây giờ, chức năng đang làm việc và tiêm bị chặn. THANK YOU – Darkeden

+0

@Darkeden: Bạn được chào đón – Sarfraz

+3

Giải pháp tuyệt vời, đơn giản. Có một lỗi trong regex, a-Z nên là a-z nếu không php cho sai lầm :) – Spaceship09

2

tôi nghĩ anh ấy đang nói về điều gì đó đánh giá khác nhau khi đi qua một mảng

strcasecmp($_GET['password'], $password) == 0) { echo($secret); } ' Nếu bạn vượt qua một mảng trống rỗng vào strcasecmp nó sẽ đánh giá là true đối với bất cứ lý do gì.

IE: mật khẩu index.php = []

+0

+1 điều này cũng được ghi lại ở đây: https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet#Input_handling –

0

url của bạn muốn trở thành như thế

www.mysite.com/page.php? name = john

nhưng bạn muốn ngăn chặn chèn cái gì đó như

www.mysite.com/page.php này? tên [] = john

giải pháp:

<?php 
$myname = is_array($_GET['name'])? "invalid" : $_GET['name'] ; 
echo $myname; 
?>