2009-10-22 36 views
11

Tôi đang cố gắng tìm ra cách để dễ dàng xóa sạch tất cả các biến POST và GET bằng một hàm duy nhất. Dưới đây là các chức năng chính:

//clean the user's input 
function cleanInput($value, $link = '') 
{ 
    //if the variable is an array, recurse into it 
    if(is_array($value)) 
    { 
     //for each element in the array... 
     foreach($value as $key => $val) 
     { 
      //...clean the content of each variable in the array 
      $value[$key] = cleanInput($val); 
     } 

     //return clean array 
     return $value; 
    } 
    else 
    { 
     return mysql_real_escape_string(strip_tags(trim($value)), $link); 
    } 
} 

Và đây là đoạn code mà sẽ gọi nó là:

//This stops SQL Injection in POST vars 
foreach ($_POST as $key => $value) 
{ 
    $_POST[$key] = cleanInput($value, $link); 
} 

//This stops SQL Injection in GET vars 
foreach ($_GET as $key => $value) 
{ 
    $_GET[$key] = cleanInput($value, $link); 
} 

Đối với tôi điều này dường như nó nên làm việc. Nhưng đối với một số lý do nó sẽ không trả lại mảng từ một số hộp kiểm tôi có trong một hình thức. Họ tiếp tục trống rỗng.

Tôi đã kiểm tra mã của mình mà không có hàm ở trên và hoạt động tốt, tôi chỉ muốn thêm chút bảo mật trong đó.

Cảm ơn!

+1

Bạn nên tránh cố gắng vệ sinh mọi thứ cho mọi ngữ cảnh. Điều đó chỉ cản trở ứng dụng của bạn và khiến bạn khó bảo mật hơn khi bạn muốn tạo lại chức năng bị mất. Đây là một lý do hợp lệ tại sao magic_quotes bị vô hiệu hóa. http://php.net/manual/en/security.magicquotes.php Một cái gì đó bạn đang tái tạo trong một ý nghĩa ở đây. Đầu vào cần được khử trùng cho ứng dụng bạn đang gửi đến. Nếu bạn đang gửi tới trình duyệt qua HTTP, hãy vệ sinh nó cho HTTP và HTML. Nếu bạn đang gửi nó đến SQL DB, hãy khử trùng nó cho SQL. – bucabay

+0

xin lỗi, tôi có nghĩa là không được chấp nhận: http://php.net/manual/en/security.magicquotes.php – bucabay

+0

Cảm ơn bạn đã giúp đỡ/tư vấn tất cả! Có vẻ như tôi cần phải suy nghĩ lại quá trình của mình. :-) – tscully

Trả lời

6

Điều bạn đang làm là không đủ. Xem here.

22

Sử dụng filter_input nếu có thể (php5 +) Nó giữ cho nó sạch hơn rất nhiều và theo tôi biết bạn có thể khử trùng và xác thực mọi thứ bạn có thể cần bằng cách sử dụng.

Bạn có thể sử dụng filter var array và ví dụ FILTER_SANITIZE_STRING cờ để lọc toàn bộ bài mảng

filter_var_array($_POST, FILTER_SANITIZE_STRING) //just an example filter 

Có rất nhiều tùy chọn lọc khác nhau có sẵn trên w3schools filter reference

+0

ồ điều này thật tuyệt vời!Tôi chưa bao giờ thấy điều này trước đây :) – Mickey

+1

đây là phương pháp tốt nhất nếu bạn có php5 – robjmills

1

hộp kiểm được kiểm soát không được gửi đến máy chủ .

bạn có thể sử dụng array_walk_recursive để thực hiện những gì bạn muốn

6

để làm cho đệ quy tao nhã hơn, bạn có thể sử dụng một cái gì đó giống như array_map ví dụ:

$_POST = array_map('mysql_real_escape_string',$_POST); 

Sử dụng var lọc nếu bạn có thể mặc dù như các loại phương pháp nói chung là xấu, chỉ là ví dụ mặc dù;)

1

Đây là cách sai lầm để làm sạch đầu vào.

Áp dụng chăn mysql thoát hoàn toàn mọi thứ trong $_POST$_GET sẽ trở lại và cắn bạn, nếu bạn vẫn muốn sử dụng dữ liệu sau khi bạn đã thực hiện truy vấn cơ sở dữ liệu nhưng bạn không muốn ký tự thoát đó.

Sử dụng truy vấn được tham số hóa với mysqli hoặc PDO và bạn sẽ không bao giờ cần phải sử dụng mysql_real_escape_string().

+0

Thậm chí tệ hơn nếu bạn không có kết nối với cơ sở dữ liệu đã được khởi tạo. – alex

+0

Tôi có kết nối được thiết lập ngay phía trên cuộc gọi chức năng, nhưng các bạn không cần phải xem những gì tôi đã có ở đó. ;-) – tscully

+0

xem: http://php.net/manual/en/security.magicquotes.php – bucabay

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