我是新手,我刚刚建立了一个CRUD系统,但它根本不安全。编辑页面在URL中有ID号,用户可以简单地随机键入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保存了记录,但它仍然看起来不合适,并在网址中添加了id标记。
答案 0 :(得分:0)
您必须在所有SQL查询中添加用户/记录所有者唯一标识,通常为:
if (is_array($array)) {
foreach ($array as $key => $val) {
$array[$key] = trim($val);
}
}
通过这种方法,您可以确保用户只能访问他的记录。登录用户的ID可以放在$query = "SELECT * FROM table WHERE id = 1 AND user_id = 2";
。
不建议隐藏或散列ID,它是反模式的security through obscurity。