jak uniknąć SQL injection w codeigniter

W CodeIgniter, Jak mogę uniknąć SQL injection? Czy jest jakaś metoda, aby ustawić w pliku konfiguracyjnym, aby uniknąć SQL injection? Używam tego kodu do wybierania wartości:

$this->db->query("SELECT * FROM tablename WHERE var='$val1'");

I to do wstawiania wartości:

$this->db->query("INSERT INTO  tablename (`var1`,`var2`) VALUES ('$val1','$val2')");

Inną metodą używaną do wstawiania i wybierania wartości z bazy danych są metody insert() I get() CodeIgniter. Jest szansa, aby SQL injection podczas korzystania z funkcji Bulit-in CodeIgniter

Author: Francisco Alvarado, 2011-05-02

6 answers

Metody CodeIgniterActive Record automatycznie uciekają od zapytań, aby zapobiec wstrzykiwaniu sql.

$this->db->select('*')->from('tablename')->where('var', $val1);
$this->db->get();

Lub

$this->db->insert('tablename', array('var1'=>$val1, 'var2'=>$val2));

Jeśli nie chcesz używać aktywnych rekordów, możesz użyć wiązań zapytań , aby zapobiec wstrzyknięciu.

$sql = 'SELECT * FROM tablename WHERE var = ?';
$this->db->query($sql, array($val1));

Lub do wstawiania możesz użyć insert_string() metoda.

$sql = $this->db->insert_string('tablename', array('var1'=>$val1, 'var2'=>$val2));
$this->db->query($sql);

Istnieje również escape() metoda, jeśli wolisz uruchamiać własne zapytania.

$val1 = $this->db->escape($val1);
$this->db->query("SELECT * FROM tablename WHERE var=$val1");
 48
Author: Rocket Hazmat,
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
2018-02-01 14:45:54

Możesz użyć

$this->db->escape()

Metoda..

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

Inne metody są tutaj wymienione.

Http://codeigniter.com/user_guide/database/queries.html

 6
Author: Vamsi Krishna B,
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-05-02 13:08:21

Powinieneś unikać pisania zapytań bezpośrednio w łańcuchu znaków, a następnie przekazywania ich do funkcji zapytania. Lepszą opcją byłoby użycie klasy Active Record, która zbuduje Twoje zapytania dla Ciebie i ucieknie od wartości. http://codeigniter.com/user_guide/database/active_record.html

Jeśli chcesz uniknąć używania klasy Active Record z jakiegokolwiek powodu, możesz wyświetlić dokumentację Codeigniter dla klasy bazy danych, która ma metodę escape dla wypisywanie wartości przed przekazaniem ich do metody kwerendy. http://www.codeignitor.com/user_guide/database/queries.html

Ben

 3
Author: Ben,
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-05-02 13:14:57

W CodeIgniter: Istnieją 2 działania zapobiegające wtrysku SQL. Dla tych, którzy są nowością w programowaniu internetowym, innym rodzajem dziury bezpieczeństwa w programowaniu internetowym, która może być śmiertelna, ponieważ może ujawnić wewnętrzną stronę bazy danych aplikacji, jest to SQL Injection.

I na szczęście, Codeigniter ma możliwość radzenia sobie z tym. Ale niestety, wielu programistów CI, z którymi współpracowałem (a nawet ty), nie (lub może) zapomniało o tych dwóch działaniach, aby zapobiec jakimkolwiek okolicznościom SQL wstrzyknięcie.

Trzymaj się możliwości ActiveRecord Pierwszą rzeczą jest to, aby w żadnych okolicznościach nie radzić sobie z zapytaniem danych za pomocą pełnego zapytania takiego jak:

$this->db->query("select * from users where user=$user and password=$password")

Nie wiesz co dokładnie wewnątrz $user lub $password zmienna jeśli chodzi o użytkownika, który celowo zrobi coś złego. Nawet XSS sanitisser nie poradzi sobie z kimś, kto wprowadzi w nim kombinację cudzysłowu, średnika lub znaku myślnika. Więc w tym przypadku musisz nauczyć się tego Active Record ponieważ posiada funkcję dezynfekcji wejścia dedykowaną do zapobiegania SQL injection. I nie martw się, obsługuje takie łańcuchy funkcji:

$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);

$query = $this->db->get();

Ale pamiętaj, że to nie zadziała, jeśli nadal wykonasz łączenie zwykłej (częściowo) funkcji zapytań wewnątrz funkcji active record, jak to:

$query = $this->db->where("title LIKE '%$input%'");

Które właściwie można zmienić w ten sposób.

$query = $this->db->like("title", $input);

Chodzi o to, aby wykorzystać każdą możliwość aktywnego rekordu Codeignitera i nie zadzierać z nim.

Ale jeśli to ain ' t work, there is an alternative Jeśli masz bardzo długie zapytanie i nie zawracasz sobie głowy przekonwertowaniem go na styl Active Record, możesz ręcznie odczytać dane wejściowe za pomocą tej funkcji:

$sanitised_title = $this->db->escape($title);

/ / do użycia wewnątrz jak zapytanie

$sanitised_title = $this->db->escape_like_str($title);

I możesz bezpiecznie połączyć dane Sanitized / escaped w zapytaniu.

 1
Author: user5751226,
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-01-06 08:36:48

Możesz sprawdzić, czy var zawiera tylko litery cyfr, co oznacza, że var ma być w zdefiniowanym formacie. przed wstawieniem go do zapytania

 0
Author: Mark T,
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-05-02 13:05:13

Akceptując wartość od strony klienta, lepiej użyć tego kodu,

$client = $this->input->post('client',TRUE);

Podczas wstawiania lepiej użyć metody wstawiania codeigniter,

$this->db->insert('tablename',$values);

Podczas korzystania z tej metody codeingniter automatycznie wykonuj wszystkie escape, więc nie musimy wykonywać instrukcji escape.

 0
Author: shihabudheen,
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
2012-09-18 13:35:13