我是一個新手,我只是建立了一個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,是否阻止未經授權的訪問?如果你所做的只是模糊了信息,這就是所謂的默默無聞的安全性,它不是一個好主意。您需要檢查用戶的授權以查看/更新/刪除數據,而不管它們提供了哪些項目標識。 –