Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 安全删除数据库条目的Codeigniter方法_Php_Mysql_Database_Codeigniter - Fatal编程技术网

Php 安全删除数据库条目的Codeigniter方法

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

我一直在搜索如何删除Codeigniter中的db条目,最后我创建了一个我认为安全的解决方案。如果有任何反馈,我将不胜感激!我不确定我是否做对了

优势:

  • 使用POST请求

  • 要删除的条目的ID为
    验证

  • 使用CSRF保护(自动
    由Codeigniter生成)

在我的示例中,我正在删除用户提交的链接(DB表行包含链接标题、链接URL和链接描述)

HTML:数据库实体包含在表单中。每个条目都有一个表单按钮,该按钮在
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。这不是必需的,但您的方法有两个不同的用途,这取决于是否提交了表单(然后让我们处理数据)或是否应该输出表单。顺便说一句,请再次检查代码,因为我之前犯了一个小错误。谢谢你的精彩反馈:)
是自然的吗。链接很好,我一直在寻找好的黑客示例,并且无法找到