通过Get传递MySQL唯一ID时的PHP安全性
假设我有一个网站,在主页上有各种书籍的链接通过Get传递MySQL唯一ID时的PHP安全性,php,security,obfuscation,Php,Security,Obfuscation,假设我有一个网站,在主页上有各种书籍的链接 <a href='books.php?id=1'>Book 1</a> <a href='books.php?id=2'>Book 2</a> <a href='books.php?id=4'>Book 3</a> 书1-3在我的系统中,但是id=3是另一个目录的一部分,我没有通过网站的这个部分展示或授权。因此,如果用户单击Book3,然后将id=4更改为id=3,他们可以简
<a href='books.php?id=1'>Book 1</a>
<a href='books.php?id=2'>Book 2</a>
<a href='books.php?id=4'>Book 3</a>
书1-3在我的系统中,但是id=3是另一个目录的一部分,我没有通过网站的这个部分展示或授权。因此,如果用户单击Book3,然后将id=4更改为id=3,他们可以简单地调出记录(假设我没有正确的会话检查)
在尝试提取特定记录时,有没有一种好方法可以隐藏您传递的get id?似乎只传递id就可以很容易地请求页面,如果没有适当的查询和会话检查,您将能够获得另一个结果
有更好的方法吗
干杯只需检查id是否允许显示。
get的一个良好实践是,当您检查任何参数时。您需要始终检查用户是否能够访问该页面。这是验证您没有显示错误数据的唯一方法,因为即使您以某种方式隐藏了链接,也有人可以随时修改他们要显示的链接
这是无法逃避的。您始终需要验证记录是否可以访问。您可能可以使用
md5
或其他任何工具来散列您的id或其他内容,以增加手动输入的难度,但这确实不是一个好主意
您应该做的是在
books.php
脚本中实现服务器端安全,以防止用户进行未经授权的访问。这是确保网站安全的唯一方法。只要大声想一想:
if (user is not in user_level) // user is not allowed to see everything
{
redirect to previous page;
}
else if (user is in user_level) // user is allowed to see everything
{
display all items;
}
您肯定需要检查是否允许用户查看页面。
但是,如果您将不同目录的ID分开会怎么样?URL可能看起来像books.php?cat=foo&id=1。这不一定会使事情变得更安全,但它可以防止人们意外地发现错误的页面,并使事情组织得更好