创建对数据库条目的安全锚引用

时间:2016-03-08 15:03:12

标签: 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位或字符串哈希的唯一列吗?

1 个答案:

答案 0 :(得分:1)

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

但我认为这不是正确的方法。我在此建议的是创建一个新表,该表将每个用户的可用文档关联起来,或者根据您的应用需求将这些方法与用户相关联的表。 例如:

//documents_for_users

document | user
0803161  |  1
0803162  |  1

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

控制器

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;
}

这样可以显着提高您的安全性