如何在CodeIgniter中避免SQL注入?

dwbf0jvd  于 2022-12-16  发布在  其他
关注(0)|答案(7)|浏览(179)

是否有任何方法可以在配置文件中设置,以避免SQL注入?我使用以下代码来选择值:

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

下面是插入值:

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

另一种用于从数据库中插入和选择值的方法是CodeIgniter的insert()get()方法。

njthzxwz

njthzxwz1#

CodeIgniter的Active Record方法自动为您转义查询,以防止SQL注入。

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

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

如果不想使用活动记录,可以使用query bindings来防止注入。

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

2mbi3lxu2#

您可以使用

$this->db->escape()

字符串
方法..

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

这里列出了其它方法。
http://codeigniter.com/user_guide/database/queries.html

soat7uwm

soat7uwm3#

您应该尽量避免将查询直接写入字符串,然后将其传递给查询函数。更好的选择是使用Active Record类,它将为您构建查询并转义值。http://codeigniter.com/user_guide/database/active_record.html
如果您出于任何原因希望避免使用活动记录类,则可以查看数据库类的Codeigniter文档,该数据库类具有转义方法,用于在将值传递给查询方法之前对其进行转义。http://www.codeignitor.com/user_guide/database/queries.html

fivyi3re

fivyi3re4#

当从客户端接受值时,最好使用此代码,

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

插入时最好采用codeigniter插入方法,

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

当使用这种方法编码时,niter自动执行所有的转义,所以我们不需要手动执行转义。

wlwcrazw

wlwcrazw5#

在代码点火器中:有两个措施可以防止SQL注入。对于那些在Web编程中是新奇的人来说,另一种Web编程中的安全漏洞可能是致命的,因为它可以暴露你的应用程序的数据库内部,这是SQL注入。
再次感谢的是,Codeigniter有能力处理它,但不幸的是,我合作的许多CI程序员(甚至你)没有(或可能)忘记这两个动作,以防止任何情况下的SQL注入。
坚持使用ActiveRecord功能第一件事是不要在任何情况下使用完整查询来处理数据查询,如下所示:

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

当用户故意做错误的事情时,你不知道**$user或$password**变量中的确切内容。即使是XSS sanitiser也不会处理那些在其中输入引号、分号或破折号字符组合的人。因此,在这种情况下,你需要学习Active Record,因为它有专门用于防止SQL注入的输入sanitiser功能。不要担心。它支持如下函数链接:

$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的活动记录的每一个可能性位,不要弄乱它。
但如果这不起作用,还有一个替代方法如果您有一个非常长的查询,并且不想麻烦将其转换为活动记录的样式,您可以使用此函数手动净化您的输入:

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

//用于LIKE查询内部

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

并且可以安全地在查询中连接经过净化/转义的输入。

okxuctiv

okxuctiv6#

在将变量插入查询之前,可以检查变量是否只包含字母或数字,这意味着变量必须采用您定义的格式

pwuypxnk

pwuypxnk7#

CodeIgniter提供了内置函数和库来防止这种情况:

$this->db->escape();

此函数自动在数据两边添加单引号并确定数据类型,以便只能转义字符串数据。

相关问题