как избежать 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).")";
другие методы, перечисленные здесь.
вы должны стараться избегать записи запросов непосредственно в строку, а затем передавать их функции запроса. Лучшим вариантом было бы использовать класс 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 автоматически делает все побег, поэтому нам не нужно делать побег вручную.