我正在使用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位或字符串哈希的唯一列吗?
答案 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;
}
这样可以显着提高您的安全性