membersihkan variabel $_POST [duplikat]

Saya mencoba menemukan cara untuk secara efektif membersihkan semua variabel POST dan GET dengan satu fungsi. Inilah fungsinya sendiri:

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

Dan inilah kode yang akan memanggilnya:

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

Bagi saya ini sepertinya ini akan berhasil. Tetapi untuk beberapa alasan itu tidak mengembalikan array dari beberapa kotak centang yang saya miliki di formulir. Mereka tetap tampil kosong.

Saya telah menguji kode saya tanpa fungsi di atas dan berfungsi dengan baik, saya hanya ingin sedikit keamanan tambahan di sana.

Terima kasih!


person tscully    schedule 22.10.2009    source sumber
comment
Anda harus menghindari upaya membersihkan segala sesuatu untuk setiap konteks. Hal ini hanya menghambat aplikasi Anda dan mempersulit pengamanannya saat Anda ingin membuat ulang fungsionalitas yang hilang. Ini adalah alasan sah mengapa magic_quotes dinonaktifkan. php.net/manual/en/security.magicquotes.php Sesuatu yang Anda' menciptakan kembali dalam arti tertentu di sini. Masukan perlu dibersihkan untuk aplikasi tujuan pengirimannya. Jika Anda mengirim ke browser melalui HTTP, sanitasikan untuk HTTP, dan HTML. Jika Anda mengirimkannya ke SQL DB, bersihkan untuk SQL.   -  person bucabay    schedule 23.10.2009
comment
maaf, maksud saya tidak berlaku lagi: php.net/manual/en/security.magicquotes.php   -  person bucabay    schedule 23.10.2009
comment
Terima kasih atas bantuan/saran semuanya! Sepertinya saya perlu memikirkan kembali proses saya. :-)   -  person tscully    schedule 23.10.2009


Jawaban (5)


Apa yang Anda lakukan tidaklah cukup. Lihat di sini .

person ryeguy    schedule 22.10.2009

Gunakan filter_input jika memungkinkan (php5 +) Itu membuatnya lebih bersih dan sejauh yang saya bisa sadar Anda dapat membersihkan dan memvalidasi semua yang Anda perlukan dengan menggunakannya.

Anda dapat menggunakan filter var array dan misalnya FILTER_SANITIZE_STRING untuk memfilter seluruh susunan postingan

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

Ada banyak opsi filter berbeda yang tersedia di referensi filter w3schools

person Andrew    schedule 22.10.2009
comment
oh ini luar biasa! aku belum pernah melihat ini sebelumnya :) - person Mickey; 23.10.2009
comment
ini adalah metode terbaik jika Anda memiliki php5 - person robjmills; 23.10.2009

untuk membuat rekursi lebih elegan Anda dapat menggunakan sesuatu seperti array_map misalnya:

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

Gunakan filter var jika Anda bisa karena pendekatan semacam ini umumnya buruk, hanya sebuah contoh;)

person robjmills    schedule 22.10.2009

kotak centang yang tidak dicentang tidak dikirim ke server.

Anda dapat menggunakan array_walk_recursive untuk melakukan apa yang Anda inginkan

person w35l3y    schedule 22.10.2009

Ini adalah cara yang salah untuk membersihkan masukan.

Menerapkan pelolosan mysql selimut ke semua yang ada di $_POST dan $_GET akan kembali dan menggigit Anda, jika Anda masih ingin menggunakan data setelah Anda membuat kueri basis data tetapi Anda tidak ingin karakter pelolosan di sana.

Gunakan kueri berparameter dengan mysqli atau PDO dan Anda tidak perlu menggunakan mysql_real_escape_string().

person Ben James    schedule 22.10.2009
comment
Lebih buruk lagi jika Anda belum memiliki koneksi ke database. - person alex; 23.10.2009
comment
Saya telah mengatur koneksi tepat di atas pemanggilan fungsi, tetapi kalian tidak perlu melihat apa yang saya dapatkan di sana. ;-) - person tscully; 23.10.2009
comment
lihat: php.net/manual/en/security.magicquotes.php - person bucabay; 23.10.2009