Czy CodeIgniter automatycznie zapobiega SQL injection?

Właśnie odziedziczyłem projekt, ponieważ ostatni deweloper odszedł. Projekt jest zbudowany na bazie Code Igniter. Nigdy wcześniej nie pracowałem z Code Igniter.

Rzuciłem okiem na kod i widzę wywołania bazy danych w kontrolerze TAK:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$_POST['user_name']."'");

Lub wywołania w ten sposób:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");

Czy code igniter automatycznie dezynfekuje te zapytania, aby zapobiec SQL injection?

Author: Abdulla Nilam, 2009-10-24

12 answers

CodeIgniter usuwa zmienne, które przekazujesz przy użyciu metody $this->db->query. Ale tylko wtedy, gdy przekazujesz zmienne jako bindy, oto przykład:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '?'", array($this->input->post('username')));

Należy również pamiętać, że {[2] }nie powinno być preferowane od $this->input->post, ponieważ sprawdza, czy zmienne istnieją, aby zapobiec błędom.

 66
Author: MarioRicalde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-26 14:25:18

CodeIgniter udostępnia w swojej warstwie bazy danych kilka funkcji typu string escaping.

Fragment z CI Manual:

Jest to bardzo dobra praktyka bezpieczeństwa, aby uciec swoje dane przed przesłaniem ich do bazy danych. CodeIgniter ma trzy metody , które pomogą Ci to zrobić:

  1. $this - > db - > escape() Ta funkcja określa typ danych tak, że może zawierać tylko dane łańcuchowe. Automatycznie dodaje również pojedyncze cudzysłowy wokół danych, więc nie musisz:

    $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
    

Zamieściłbym pozostałe dwa przykłady, ale nie chciałbym zabierać całej zabawy z czytania podręcznika.

 21
Author: John Himmelman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-13 18:49:00

Nie, opublikowany kod jest podatny na SQL injection. Musisz użyć wiązania zapytań do konstruowania zapytań SQL. Jeśli używasz biblioteki Ci DB, kodujesz ją w następujący sposób (przykład z podręcznika użytkownika):

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";

$this->db->query($sql, array(3, 'live', 'Rick')); 
 13
Author: Funkatron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-25 04:14:25

Nie, CodeIgniter nie będzie magicznie dezaktywować zapytań, które zostały zbudowane w ten sposób.

 4
Author: Ben James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-23 20:49:29

Zgodnie z dokumentami CI tutaj , framework filtruje POST na budowie kontrolera. Opcjonalnie wykonuje również filtrowanie XSS poprzez ręczne wywołanie funkcji lub ustawienie globalnej konfiguracji.

Ja też nigdy nie używałem CI, tylko po to, żeby się nim bawić, więc nie jestem pewien, na ile bym mu zaufał.

 3
Author: Josh Lindsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-23 20:54:35

To niczego nie umknie. Lepiej zmienić ją na składnię bind lub składnię Active record

 2
Author: Thorpe Obazee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-26 03:47:25

Powinieneś użyć $this->input - >post, powiązania zapytań i active record, aby mieć bezpieczniejsze dane, a następnie test test test, aby mieć pewność.

 2
Author: stef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-26 09:46:09

Użyj active record dla bezpieczeństwa i łatwiejszego kodowania:

Zamiast:

  $dbResult = $this->db->query("SELECT * FROM users WHERE username'".$_POST['user_name']."'");

Użycie (ten sam wynik):

$this->db->where('username',$this->input->post('user_name');
$dbResult = $this->db->get('users');
 2
Author: Rid Iculous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-11 09:54:51

Może to być bolesne, ale powinieneś przekonwertować swoje zapytania na active record.

Kopiuję z podręcznika CodeIgniter: "Poza prostotą, główną zaletą korzystania z funkcji Active Record jest to, że pozwala na tworzenie aplikacji niezależnych od bazy danych, ponieważ składnia zapytań jest generowana przez każdą Adapter Bazy danych. pozwala również na bezpieczniejsze zapytania, ponieważ wartości są automatycznie przetwarzane przez system ."

I jak niektórzy już mówili, tak to kod jest podatny na SQL injection

 0
Author: VangelisB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-29 07:10:45

Zoptymalizowany z drugim postem param (TRUE) do filtrowania XSS na poziomie wejściowym:

$this->db->where('username',$this->input->post('user_name', TRUE);
$dbResult = $this->db->get('users');

Biblioteki / wejście.html

 0
Author: BeKa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-04 17:54:59

Docs For (conajmniej) 2.2 state, in a big red box:

Chociaż Active Record będzie starał się jak najlepiej poprawnie cytować nazwy pól i tabel, które go karmisz, zauważ, że nie jest zaprojektowany do pracy z dowolnymi danymi wejściowymi użytkownika. Nie karmić go niezanieczyszczonymi danymi użytkownika.

Co dla programisty oznacza "nie polegaj na Active Record aby cytować cokolwiek ".

 0
Author: Madbreaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 22:17:38

Użycie funkcji escape do iniekcji CI

<?php $username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.$this->db->escape($email);
$this->db->query($query);?>
 0
Author: Akbor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-08 10:08:03