Php 安全删除数据库条目的Codeigniter方法
我一直在搜索如何删除Codeigniter中的db条目,最后我创建了一个我认为安全的解决方案。如果有任何反馈,我将不胜感激!我不确定我是否做对了 优势:Php 安全删除数据库条目的Codeigniter方法,php,mysql,database,codeigniter,Php,Mysql,Database,Codeigniter,我一直在搜索如何删除Codeigniter中的db条目,最后我创建了一个我认为安全的解决方案。如果有任何反馈,我将不胜感激!我不确定我是否做对了 优势: 使用POST请求 要删除的条目的ID为 验证 使用CSRF保护(自动 由Codeigniter生成) 在我的示例中,我正在删除用户提交的链接(DB表行包含链接标题、链接URL和链接描述) HTML:数据库实体包含在表单中。每个条目都有一个表单按钮,该按钮在id属性中具有相应的链接id <?php echo form_open('pro
- 使用POST请求
- 要删除的条目的ID为
验证 - 使用CSRF保护(自动
由Codeigniter生成)
id
属性中具有相应的链接id
<?php echo form_open('profile/remove_link'); ?>
<?php echo form_hidden('link_id', ''); //value will be populated via jquery ?>
<ul id="user_links">
<?php foreach($query as $row): ?>
<li><?php echo $row->link_title; ?></li>
<li><?php echo auto_link($row->link_url, 'url', TRUE); ?></li>
<li><?php echo $row->link_description; ?></li>
<button type="submit" class="remove" id="<?php echo $row->link_id ?>" value="remove">Remove Link</button>
<?php endforeach; ?>
</ul>
</form>
单击删除按钮后,它会将要删除的链接id发送到控制器配置文件
和功能删除链接
function remove_link()
{
$this->load->model('Profile_model');
$links_data['query'] = $this->Profile_model->links_read(); //get links from db to add in view
//Validation
$this->form_validation->set_rules('link_id', 'Link ID', 'trim|required|xss_clean|max_length[11]|numeric'); //validate link id
if ($this->form_validation->run() == FALSE) //if validation rules fail
{
$this->load->view('profile/edit_links_view', $links_data);
}
else //success
{
$link_id = $this->input->post('link_id'); //get id of link to be deleted
$seg = 'user_links'; //used to redirect back to user links page
$this->Profile_model->links_delete($link_id, $seg); //send link id to model function
}
}
模型
function links_delete($link_id, $seg)
{
$this->db->where('user_id', $this->tank_auth->get_user_id());
$this->db->where('link_id', $link_id);
$this->db->delete('user_links');
redirect("/profile/$seg/");
}
我唯一认为错误的是,您没有验证谁可以删除记录,谁不能删除记录。这是你唯一应该关注的问题。检查发送删除请求的人员是否允许执行此类操作的权限。除此之外,这只是一个偏好的问题。我认为唯一错误的是,您没有验证谁可以删除记录,谁不能删除记录。这是你唯一应该关注的问题。检查发送删除请求的人员是否允许执行此类操作的权限。除此之外,这只是偏好的问题。如果ID是数据库中唯一的整数,则可以删除以下规则: 修剪| xss |清洁|数字 加上这个, 你是自然的吗 如果表单元素包含除自然数以外的任何内容,但不包含零:1、2、3等,则返回FALSE 允许使用一些您可能不需要的字符,例如小数和负数。以下是来源(一行): 如果出于某种原因,您在验证之前在HTML输出中回显输入,或者只是多疑,那么请务必:xss_清除它。否则就不需要了,因为我不认为有任何可能的XSS攻击方法只使用一个数字 参考:
此外,您可能希望在查询中添加一个
LIMIT 1
子句,并确保从模型中返回一个值(可能为真/假),以便知道查询是否成功,从而可以向用户提供反馈,而不是假设一切正常。如果ID是数据库中唯一的整数,您可以删除以下规则:
修剪| xss |清洁|数字
加上这个,
你是自然的吗
如果表单元素包含除自然数以外的任何内容,但不包含零:1、2、3等,则返回FALSE
允许使用一些您可能不需要的字符,例如小数和负数。以下是来源(一行):
如果出于某种原因,您在验证之前在HTML输出中回显输入,或者只是多疑,那么请务必:xss_清除它。否则就不需要了,因为我不认为有任何可能的XSS攻击方法只使用一个数字
参考:
另外,您可能希望在查询中添加一个
LIMIT 1
子句,并确保从模型中返回一个值(可能是TRUE/FALSE),以便知道查询是否成功,因此,您可以向用户提供反馈,而不是假设一切顺利。我建议稍微重写控制器和模型,以使流程更具逻辑性并提供更好的性能:
控制器:
function remove_link()
{
if ($this->input->post('link_id'))
{
//Validation
$this->form_validation->set_rules('link_id', 'Link ID', 'is_natural_no_zero');
if ($this->form_validation->run())
{
$seg = 'user_links'; //do you really need to assign it to variable ??
$this->load->model('Profile_model');
if ($this->Profile_model->links_delete($this->input->post('link_id')) //send link id to model function
{
redirect('/profile/user_links'); // redirect user in controller and only when model returns true
}else{
// inform user about error somehow, eg. by setting session flashdata and redirecting back to /profile/user_links
}
}
} // else statement here was a mistake as in case of form_validation failure nothing happened
$this->load->model('Profile_model');
$links_data['query'] = $this->Profile_model->links_read(); //get links from db to add in view
$this->load->view('profile/edit_links_view', $links_data);
}
型号:
function links_delete($link_id)
{
$this->db->where('user_id', $this->tank_auth->get_user_id())
->where('link_id', $link_id)
->delete('user_links'); // you can chain methods without writing always $this->db->
return $this->db->affected_rows(); // returns 1 ( == true) if successfuly deleted
}
作为jQuery代码的一个补充说明,我建议使用$(“#some_id”)而不是$('input[name=XXXX]”)-这样可以节省一些javascript代码执行,因此速度更快我建议重写控制器和模型,使流更具逻辑性并提供更好的性能: 控制器:
function remove_link()
{
if ($this->input->post('link_id'))
{
//Validation
$this->form_validation->set_rules('link_id', 'Link ID', 'is_natural_no_zero');
if ($this->form_validation->run())
{
$seg = 'user_links'; //do you really need to assign it to variable ??
$this->load->model('Profile_model');
if ($this->Profile_model->links_delete($this->input->post('link_id')) //send link id to model function
{
redirect('/profile/user_links'); // redirect user in controller and only when model returns true
}else{
// inform user about error somehow, eg. by setting session flashdata and redirecting back to /profile/user_links
}
}
} // else statement here was a mistake as in case of form_validation failure nothing happened
$this->load->model('Profile_model');
$links_data['query'] = $this->Profile_model->links_read(); //get links from db to add in view
$this->load->view('profile/edit_links_view', $links_data);
}
型号:
function links_delete($link_id)
{
$this->db->where('user_id', $this->tank_auth->get_user_id())
->where('link_id', $link_id)
->delete('user_links'); // you can chain methods without writing always $this->db->
return $this->db->affected_rows(); // returns 1 ( == true) if successfuly deleted
}
作为jQuery代码的补充说明,我建议使用$(“#some_id”)而不是$('input[name=XXXX])-这样可以节省一些javascript代码的执行速度,因此更快用户验证可能是独立的,在每个请求上运行。我有
$this->db->where('user_id',$this->tank_auth->get_user_id())代码>。我仅从登录用户中删除记录。也许我也应该有if($this->tank\u auth->get\u user\u id())
?用户验证可能是独立的,在每个请求上运行。我有$this->db->where('user\u id',$this->tank\u auth->get\u user\u id())代码>。我仅从登录用户中删除记录。如果($this->tank\u auth->get\u user\u id()),也许我也应该有。
?谢谢你的建议!返回受影响的行以及在jquery中只使用id属性是一个好主意。但是,是否有必要在控制器中检查输入是否已提交?CI的内置函数已检查该项是否已设置,否则返回false。这不是必需的,但您的方法有两个不同的用途,这取决于是否提交了表单(然后让我们处理数据)或是否应该输出表单。顺便说一句,请再次检查代码,因为我之前犯了一个小错误。谢谢你的建议!返回受影响的行以及在jquery中只使用id属性是一个好主意。但是,是否有必要在控制器中检查输入是否已提交?CI的内置函数已检查该项是否已设置,否则返回false。这不是必需的,但您的方法有两个不同的用途,这取决于是否提交了表单(然后让我们处理数据)或是否应该输出表单。顺便说一句,请再次检查代码,因为我之前犯了一个小错误。谢谢你的精彩反馈:)是自然的吗。链接很好,我一直在寻找好的黑客示例,并且无法找到