2016-12-14 97 views
-1

我是一个新手,我只是建立了一个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标记不专业。

+0

基地64编码是*不*加密。如果你想隐藏这个id,你需要生成一个令牌(一个salted hash或更好的UUID),你可以将它存储在数据库中,并与其他记录信息一起存储。 –

+1

这与安全无关,这是开发架构。首先请记住,如果我是被授权访问具有ID 1,2,3,4的记录的用户,则无关紧要,我可以通过URI手动切换页面并访问所有授权ID的数据。因此,如果您的用户有权访问所有记录ID以编辑记录,则无关紧要。您应该在您的页面顶部放置一个支票(中间件),无论该请求ID是否授权给当前用户。 – webDev

+1

另外,最重要的事情(正如@Shailesh所说)正在检查权限。谁在乎用户是否知道物品ID,是否阻止未经授权的访问?如果你所做的只是模糊了信息,这就是所谓的默默无闻的安全性,它不是一个好主意。您需要检查用户的授权以查看/更新/删除数据,而不管它们提供了哪些项目标识。 –

回答

0

您必须添加用户/记录拥有独特的识别到的所有SQL查询,通常为:

$query = "SELECT * FROM table WHERE id = 1 AND user_id = 2"; 

用这种方法,你可以确保用户只能访问自己的记录。登录用户的ID可以放置在SESSION的某处。

不推荐使用隐藏或哈希ID,这是一种反模式,并且security through obscurity

+0

正确,但是如果他的数据表中没有user_id,只需创建一个新表,您可以在其中放置record_id和user_id关系并进行检查。 – webDev

+1

是的,绝对的,具体的实现取决于他的用例,这只是为了演示的目的。 – Artegon