как избежать SQL-инъекции в codeigniter

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

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

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

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

другой метод, используемый для вставки и выбора значений из базы данных, - Codeigniter's insert() и get() методы. Есть ли шанс SQL-инъекции при использовании булит-функций CodeIgniter

6 ответов


в CodeIgniter это Активная Запись методы автоматически избежать запросов для вас, чтобы предотвратить SQL-инъекции.

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

или

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

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

$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");

можно использовать

$this->db->escape()

метод..

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

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

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


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

Если вы хотите избежать использования класса Active Record по какой-либо причине, вы можете просмотреть документацию Codeigniter для класса базы данных, который имеет escape метод экранирования значений перед их передачей в метод запроса. http://www.codeignitor.com/user_guide/database/queries.html

Бен


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

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

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

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

вы не знаете, что именно внутри $user или $ password переменная, когда дело доходит до пользователя, который будет делать намеренно неправильную вещь. Даже XSS sanitiser не будет иметь дело с кем-то, кто вводит в него комбинацию кавычек, точек с запятой или тире. Так что в этом случае, вам нужно узнать эта активная запись, потому что она имеет возможность дезинфекции ввода, предназначенную для предотвращения 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 query

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

и вы можете безопасно объединить санированный / экранированный ввод внутри вашего запроса.


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


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

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

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

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

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