Вопрос

В 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

Это было полезно?

Решение

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

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

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

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

// для использования внутри, как запрос

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top