Подтвердить что ты не робот

Как избежать инъекции 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.

4b9b3361

Ответ 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 автоматически выполняет все действия, поэтому нам не нужно избегать руководства.