Câu hỏi làm sạch biến $ _POST [trùng lặp]


Câu hỏi này đã có câu trả lời ở đây:

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. Đây là hàm của chính nó:

//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à mã sẽ gọi nó:

//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);
}

Với tôi điều này có vẻ như nó sẽ 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 đã thử nghiệm mã của tôi mà không có chức năng trên và nó hoạt động tốt, tôi chỉ muốn có thêm chút bảo mật trong đó.

Cảm ơn!


12
2017-10-22 23:26


gốc


Bạn nên tránh cố gắng khử trùng 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. 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
xin lỗi, tôi có nghĩa là không được chấp nhận: php.net/manual/en/security.magicquotes.php - bucabay
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


Các câu trả lời:


Những gì bạn đang làm là không đủ. Xem đây.


6
2017-10-22 23:42





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

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

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

Có rất nhiều tùy chọn bộ lọc khác nhau có sẵn trên w3schools tham chiếu bộ lọc


22
2017-10-22 23:31



ồ này thật tuyệt! Tôi chưa bao giờ thấy điều này trước :) - Mickey
đây là phương pháp tốt nhất nếu bạn có php5 - robjmills


để làm cho đệ quy thanh lịch hơn, bạn có thể sử dụng một cái gì đó như mảng_map ví dụ:

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

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


6
2017-10-22 23:43





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

bạn có thể sử dụng mảng_walk_recursive để làm những gì bạn muốn


1
2017-10-22 23:41





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

Áp dụng mysql chăn thoát để hoàn toàn tất cả mọi thứ trong $_POST và $_GET sẽ quay 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 các ký tự thoát trong đó.

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().


1
2017-10-22 23:46



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
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
xem: php.net/manual/en/security.magicquotes.php - bucabay