我是一个新手,我只是建立了一个CRUD系统,但它根本不安全。编辑页面在URL中有ID号,用户可以简单地随机键入ID来访问数据库中的其他记录。URl中的PHP/MySQL加密ID
http://example.com/example_edit.php?id=2
<?php
include_once("connection.php");
$result = mysqli_query($mysqli, "SELECT * FROM mkregistrationchecklists WHERE login_id=".$_SESSION['id']." ORDER BY id DESC");
?>
<tbody>
<?php
while($res = mysqli_fetch_array($result)) {
echo "<tr>";
echo "<td>".$res['id']."</td>";
echo "<td><span class='label ".$res['labelwarning']."'>".$res['status']."</span></td>";
echo "<td>".$res['todaysdatetime']."</td>";
echo "<td>".$res['tag']."</td>";
echo "<td>".$res['serialnumber']."</td>";
echo "<td>".$res['currentequipment']."</td>";
echo "<td>".$res['company']."</td>";
if ($res['status'] == "Submitted") {
echo "<td><a href='page_read.php?id=$res[id]' class='btn btn-default glyphicon glyphicon-eye-open'></a></td>";
} else{
echo "<td><a href=\"page_edit.php?id=$res[id]\" class='btn btn-default fa fa-pencil-square'></a> | <a href=\"page_delete.php?id=$res[id]\" class='btn btn-danger fa fa-trash' onClick=\"return confirm('Are you sure you want to delete?')\"></a></td>";
}
echo "</tr>";
}
?>
</tbody>
什么是确保这一目标的最佳途径?
我应该这样加密吗?
$secure_id = $_GET['id'];
$decryped_id = base64_decode($secure_id);
我更新了我的代码,即时根据login_id保存记录,但它仍然看起来与URL中的id标记不专业。
基地64编码是*不*加密。如果你想隐藏这个id,你需要生成一个令牌(一个salted hash或更好的UUID),你可以将它存储在数据库中,并与其他记录信息一起存储。 –
这与安全无关,这是开发架构。首先请记住,如果我是被授权访问具有ID 1,2,3,4的记录的用户,则无关紧要,我可以通过URI手动切换页面并访问所有授权ID的数据。因此,如果您的用户有权访问所有记录ID以编辑记录,则无关紧要。您应该在您的页面顶部放置一个支票(中间件),无论该请求ID是否授权给当前用户。 – webDev
另外,最重要的事情(正如@Shailesh所说)正在检查权限。谁在乎用户是否知道物品ID,是否阻止未经授权的访问?如果你所做的只是模糊了信息,这就是所谓的默默无闻的安全性,它不是一个好主意。您需要检查用户的授权以查看/更新/删除数据,而不管它们提供了哪些项目标识。 –