2016-03-08 115 views
0

我正在使用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> 

凡假定$document对象的handle属性是一个唯一的标识符,其方法some_method用于加载该用户点击该文档。

什么是最安全的数据库字段?我认为id字段,但其auto_increment似乎不安全,并允许人们摆弄HTML以获取禁止的文档。我应该添加一个随机的数字或字符串哈希另一个唯一的列?

+0

服务的文件之前,先检查用户的权限。 – chris85

回答

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

这样您的安全是显著上升

+0

'check_permission'方法似乎是我的选择,我不需要创建一个新表格,因为文档并不总是必须局限于其所有者。谢谢! –

+0

真的很高兴帮助! – David