php - 创建对数据库条目的安全 anchor 引用

标签 php mysql codeigniter

我正在 Code Igniter 中开发一个工作库,人们可以在其中添加、编辑和审查文档。文档信息存储在 MySQL 表中,有点像这样:

   CREATE TABLE `document` (
     `owner` varchar(15) NOT NULL,
     `id` smallint(6) NOT NULL AUTO_INCREMENT,
     `pdf` varchar(250) NOT NULL,
     `title` varchar(250) NOT NULL,
     `permission` tinyint(1) NOT NULL DEFAULT '1',
     `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
     PRIMARY KEY (`id`,`pdf`),
    ) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8

pdf字段是文件的名称。结合id它们弥补了表的主键。

在应用程序的前端部分,用户经常看到和使用这些文档的列表,我想附加它们的链接。想象一下这样的链接可以这样创建:

<a href='some_controller/some_method?pdf=<?php echo $document->handle; ?>'>Link</a>

哪里handle假定的 $document 的属性对象是方法 some_method 的唯一标识符用于加载用户单击的文档。

最安全的数据库字段是什么?我考虑过 id领域但其 auto_increment似乎不安全,并且会允许人们修改 HTML 来获取禁止的文档。我应该添加另一个带有随机 n 位或字符串哈希的唯一列吗?

最佳答案

你可以在这里做很多事情。 关于您建议在表上创建一个新列并保存文档的散列 ID 的建议,会增加一点“安全性”,因此随机键入现有 id 的概率较低。

但我认为这不是正确的方法。我在这里的建议是创建一个新表,将每个用户的可用文档关联起来,或者创建一个将方法与用户关联起来的表,具体取决于您的应用程序需求。 例如:

//documents_for_users

document | user
0803161  |  1
0803162  |  1

完成此操作后,在方法调用中,您必须在对文档执行任何操作之前检查表之间的关系。

Controller

function some_method(){
   $id = $this->input->get('pdf'); 
   $user = $this->session->userdata('userid');
   if ($this->my_model->check_permission($id,$user) {
      // do your stuff with document then
   }
}

型号

function check_permission($id,$user){
    $this->db->select('*'); 
    $this->db->from('documents_for_users'); 
    $this->db->where('document', $id);
    $this->db->where('user', $user); 
    $query = $this->db->get();    
    if ($query->num_rows() > 0){
           return true;
    }
    return false;
}

这样您的安全性将显着提高

关于php - 创建对数据库条目的安全 anchor 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35870834/

相关文章:

php - 当我导航到其他页面时, session 不会保留/销毁

javascript - 动态 php-ajax 表单

mysql - 用于扩展后端的正确架构

php - sql查询不适用于三个表连接

php - codeigniter如何在函数内的模型页面中回显获取的值

php - 谷歌图像搜索 API

php - 使用 Try/Catch PHP 方法捕获 Stripe 错误

用于更新值的 PHP 脚本无法正常工作

java - Criteria.uniqueResult 返回 null,但没有抛出错误

codeigniter - PostgreSQL 序列的下一个值?