PHP codeigniter SQL Injection (MSSQL) [duplikat]

Oct 27 2020

Saya menerima laporan yang menunjukkan kueri saya memiliki injeksi SQL, memerlukan bantuan Anda untuk memverifikasi beberapa masalah:

  1. Saya menggunakan ini sebagai pernyataan sisipan
  function insert($table_name, $insert_data)
    {
        $this->db->set($insert_data);
        if ($this->db->insert($table_name)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

sebagai contoh:

$name = 'iamklll'; $status = 1;

  $insert_data = array( 'name' => $name,
                'status' => $status, ); $this->model->insert('table', $insert_data);  

Metode semacam ini tidak dapat mencegah injeksi SQL? Jika ini tidak dapat mencegah, menurut saya cara terbaik adalah query binding?

  1. Bagaimana cara mencegah injeksi SQL jika $ POST ['kolom'] adalah array?

  2. Bagaimana cara menyimpan data seolah-olah orang tersebut memasukkan test"><h1>eee</h1>? Haruskah saya gunakan htmlspecialcharsuntuk menyimpan dalam database?

Jawaban

marcogmonteiro Oct 27 2020 at 18:13

Dalam kasus Anda, Anda menggunakan pembuat kueri $ this-> db-> insert () ini menghasilkan string penyisipan berdasarkan data yang Anda berikan, dan menjalankan kueri. Anda bisa meneruskan array atau objek ke fungsi. Semua nilai di-escape secara otomatis menghasilkan kueri yang lebih aman.

Ini sebenarnya adalah pilihan terbaik menurut saya. Lebih baik daripada menggunakan query binding, terutama karena dalam jangka panjang Anda mungkin perlu mengubah dari MSSQL ke mySQL atau mesin lain dan Anda tidak perlu mengubah apa pun di kode Anda.

Karena Anda menggunakan codeigniter 3, pastikan untuk memvalidasi data Anda sebelum memasukkannya.

Gunakan validasi formulir untuk itu: https://codeigniter.com/userguide3/libraries/form_validation.html?highlight=form%20validation

Dari contoh Anda, saya pikir Anda juga mengacu pada serangan xxs. Jika demikian, Anda memiliki dua opsi, Anda dapat melakukannya sambil memvalidasi data Anda dengan validasi formulir menggunakan aturan XSS. Atau Anda dapat mengaktifkannya secara global di application / config / config.php

$config['global_xss_filtering'] = true;

Karena kita berbicara tentang melindungi aplikasi Anda, Anda mungkin juga ingin mempertimbangkan untuk menggunakan pengaturan csrf di codeigniter. Ini juga dapat dilakukan di file config.php Anda.

/*
|--------------------------------------------------------------------------
| Cross Site Request Forgery
|--------------------------------------------------------------------------
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
| checked on a submitted form. If you are accepting user data, it is strongly
| recommended CSRF protection be enabled.
|
| 'csrf_token_name' = The token name
| 'csrf_cookie_name' = The cookie name
| 'csrf_expire' = The number in seconds the token should expire.
| 'csrf_regenerate' = Regenerate token on every submission
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
 */
$config['csrf_protection'] = true; $config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name'; $config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = true; $config['csrf_exclude_uris'] = array();

Jadi, dalam kasus Anda, menggunakan pembuat kueri tidak masalah untuk mencegah injeksi SQL yang sebenarnya Anda cari.

Yevgen Oct 27 2020 at 18:05

Anda mengacu pada kelas Rekaman Aktif. Ini memiliki pembuat kueri sendiri dan seharusnya melindungi Anda dari injeksi SQL dari kotak.

How to store the data as if the person insert test"><h1>eee</h1>

Saya pikir Anda mengacu pada serangan XSS. Saya percaya bahwa praktik terbaik adalah menghapus semua tag kecuali tag yang diizinkan . Saya tidak berpikir htmlspecialcharsakan masuk akal di sini saat Anda akan membuat konversi mundur pada output.