我正在 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/