как избежать SQL инъекций в codeigniter - PullRequest
31 голосов
/ 02 мая 2011

В CodeIgniter, как я могу избежать инъекции SQL? Есть ли способ установить в конфигурационном файле, чтобы избежать внедрения SQL? Я использую этот код для выбора значений:

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

и это для вставки значений:

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

Другим методом, используемым для вставки и выбора значений из базы данных, являются методы insert() и get() CodeIgniter. Есть ли возможность впрыска sql при использовании встроенных функций CodeIgniter

Ответы [ 6 ]

57 голосов
/ 02 мая 2011

CodeIgniter Active Record методы автоматически экранируют запросы для вас, чтобы предотвратить внедрение sql.

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

или

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

Если вы не хотитеиспользуйте Active Records, вы можете использовать привязки запросов , чтобы предотвратить инъекцию.

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

Или для вставки вы можете использовать метод insert_string().

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

Существует также метод escape(), если вы предпочитаете выполнять собственные запросы.

$val1 = $this->db->escape($val1);
$this->db->query("SELECT * FROM tablename WHERE var=$val1");
6 голосов
/ 02 мая 2011

Вы можете использовать

$this->db->escape()

метод ..

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

другие методы перечислены здесь.

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

3 голосов
/ 02 мая 2011

Вы должны стараться не записывать свои запросы непосредственно в строку, а затем передавать их в функцию запроса.Лучшим вариантом было бы использовать класс Active Record, который будет строить ваши запросы для вас и избегать значений.* 1002.http://www.codeignitor.com/user_guide/database/queries.html

Бен

1 голос
/ 06 января 2016

В CodeIgniter: есть 2 действия для предотвращения SQL-инъекций.Для новичков в веб-программировании - еще одна дыра в безопасности в веб-программировании, которая может быть фатальной, поскольку может раскрыть вашу внутреннюю сторону базы данных приложения, - это SQL-инъекция.

И, к счастью, Codeigniter имеет возможностьиметь дело с этим.Но, к сожалению, многие из программистов CI, с которыми я сотрудничал (и даже вы), забыли (или могли бы) забыть об этом двух действиях, чтобы предотвратить любые обстоятельства внедрения SQL.

Придерживайтесь возможности ActiveRecord Первое, что не следует делать ни при каких обстоятельствахиметь дело с запросом данных с помощью полного запроса, подобного следующему:

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

Вы не знаете, что именно внутри переменной $ user или $ password , когда речь идет о пользователе, который будет делать это намереннонеправильная вещь.Даже дезинфицирующее средство XSS не будет иметь дело с тем, кто вводит в него комбинацию кавычки, точки с запятой или тире.Таким образом, в этом случае вам нужно изучить эту Active Record, потому что она имеет функцию ввода дезинфицирующего средства, предназначенную для предотвращения SQL-инъекций.И не волнуйтесь, он поддерживает такие цепочки функций, как это:

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

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

Но помните, что это не сработает, если вы все равно будете комбинировать обычную (частично) функцию запроса внутри функции активной записи, как эта:

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

Что на самом деле можно изменить следующим образом.

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

Суть в том, чтобы использовать каждую битовую возможность активной записи CodeIgniter и не связываться с ней.

Но если это не сработает, есть альтернатива. Если у вас очень длинный запрос и вы не удосужились преобразовать его в стиль Active Record, вы можете санировать ввод вручную, используя эту функцию:

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

// Для использования внутри запроса LIKE

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

И вы можете безопасно объединить очищенные / экранированные входные данные внутри запроса.

0 голосов
/ 18 сентября 2012

Принимая значение со стороны клиента, лучше использовать этот код,

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

При вставке лучше использовать метод вставки кодового символа,

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

При использовании этого метода codeingniter автоматически делает все escape, поэтому нам не нужно делать escape-руководство.

0 голосов
/ 02 мая 2011

Вы можете проверить, содержат ли вы только буквы чисел, что означает, что вы должны быть в указанном вами формате.прежде чем вставить его в запрос

...