我正在开发codeigniter项目。我怎么知道我的模型中的查询函数阻止了sql注入。 即使我使用不同的方式插入数据,但我怎样才能确保哪一个是安全的。
这是我的代码:
1) *****************
$data = array(
'name' => $_POST['name'],
'email' => $_POST['email'],
'phone' => $_POST['phone'],
'city' => $_POST['city'],
'current_salary' => $_POST['current_salary'],
'expected_salary' => $_POST['expected_salary'],
'reume_link' => $file_name,
'status' => 0,
);
$this->db->insert('my_table_name', $data);
2) **************************
$query = $this->db->query('SELECT distinct(name) as name FROM `my_table_name` WHERE city like "%'.$_POST['state'].'%" ');
$res = $query->result_array();
3) **************************
$query = $this->db->query("insert into my_table_name(nid,sid,cid,data) values('766','$sid',1,'".$_POST['adm_name']."')");
codeigniter函数是否阻止sql注入默认值,或者我严格需要使用prepare statement / bind参数。
简单的CI功能不安全吗?
答案 0 :(得分:1)
以下是如何使用预准备语句的示例 -
replace
意味着您必须用实际数据替换?标记并以数组的形式将其作为第二个参数传递。
大多数ActiveRecord方法(例如$sql = 'SELECT distinct(name) name FROM `my_table_name` WHERE city like ?';
$query = $this->db->query($sql, array("%$_POST[state]%"));
,insert
等)也是安全的,只要您遵循指南。
答案 1 :(得分:0)
您应该为查询中的每个变量使用$this->db->escape_str
。另一种选择(即使是更好的选择)是使用预备语句。
答案 2 :(得分:0)
如果您使用CodeIgniter的Active Record方法,它会自动转义查询,以防止注入。
$this->db->select('*');
$this->db->from('table_name');
$this->db->where('column_name', $val1);
$this->db->get();
如果您不想使用CI Active Records,那么CI中就有$this->db->escape()
的功能
$data1 = $this->db->escape($data1);
$this->db->query("SELECT * FROM table_name WHERE var = '$data1'");
或者您可以将查询绑定用作
$sql = 'SELECT * FROM table_name WHERE var = ?';
$this->db->query($sql, array($var));
即使不使用$_POST
和$_GET
CI,其方法分别为$this->input->post()
和$this->input->get()
答案 3 :(得分:-1)
为了保护,请始终使用$this->input->post('name_of_input')
和$this->input->get('name_of_input')
代替$_POST[] & $_GET[]
答案 4 :(得分:-1)