Как избежать инъекции 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 insert()
и get()
. Есть ли вероятность внедрения sql при использовании функций Bulit-in CodeIgniter.
Ответы
Ответ 1
CodeIgniter Active Record автоматически отменяют запросы для вас, чтобы предотвратить инъекцию.
$this->db->select('*')->from('tablename')->where('var', $val1);
$this->db->get();
или
$this->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");
Ответ 2
вы можете использовать
$this->db->escape()
способ..
$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($omgomg).")";
здесь перечислены другие методы.
http://codeigniter.com/user_guide/database/queries.html
Ответ 3
Вы должны стараться не записывать свои запросы непосредственно в строку, а затем передавать их функции запроса. Лучшим вариантом будет использование класса Active Record, который будет создавать ваши запросы для вас и избежать значений. http://codeigniter.com/user_guide/database/active_record.html
Если вы хотите избежать использования класса Active Record по какой-либо причине, вы можете просмотреть документацию Codeigniter для класса базы данных, которая имеет метод escape для экранирования ваших значений перед передачей их методу запроса. http://www.codeignitor.com/user_guide/database/queries.html
Бен
Ответ 4
В CodeIgniter:
Для предотвращения внедрения SQL существует 2 действия.
Для тех, кто новшество в веб-программировании, еще один вид дыры в области безопасности в веб-программировании, который может быть фатальным, поскольку он может раскрывать вашу внутреннюю сторону базы данных приложений, это SQL Injection.
И, к счастью, Codeigniter имеет возможность справиться с этим. Но, к сожалению, многие программисты CI, с которыми я сотрудничал (и даже вы), (или могли) забыть об этом двух действиях, чтобы предотвратить любые ситуации внедрения SQL.
Придерживайтесь возможности ActiveRecord
Во-первых, ни в коем случае не занимайтесь запросом данных, используя полный запрос:
$this->db->query("select * from users where user=$user and password=$password")
Вы не знаете, что именно внутри переменной $user или $password, когда дело доходит до пользователя, который намеренно делает неправильную вещь. Даже XSS sanitiser не будет иметь дело с кем-то, кто вводит комбинацию цитаты, точки с запятой или тире в ней.
Таким образом, в этом случае вам нужно изучить эту вещь 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);
Дело в том, что каждый бит возможности CodeIgniters Active Record и не путайте с ним.
Но если это не работает, есть альтернатива
Если у вас очень длинный запрос и не нужно конвертировать его в стиль Active Records, вы можете самостоятельно очистить свой ввод вручную, используя эту функцию:
$sanitised_title = $this->db->escape($title);
//Для использования внутри запроса LIKE
$sanitised_title = $this->db->escape_like_str($title);
И вы можете безопасно объединить введенный в сатинирование/экранированный вход внутри вашего запроса.
Ответ 5
Вы можете проверить, содержат ли вы var только буквы чисел, что означает, что var mast находится в определенном формате.
прежде чем вставлять его в запрос
Ответ 6
Принимая значение с клиентской стороны, лучше использовать этот код,
$client = $this->input->post('client',TRUE);
При вставке лучше использовать метод вставки меток,
$this->db->insert('tablename',$values);
При использовании этого метода codeingniter автоматически выполняет все действия, поэтому нам не нужно избегать руководства.