我有一个存储在数据库中的购物车。当用户删除项目时,应将其从数据库中删除。 我想到的第一种方法是使用如下代码:
<?php
echo "<a href='./remove_items.php?id=1'>remove</a>";
?>
并且页面“remove_items.php”将调用sql查询以删除具有指定ID的项目(例如:1),然后转到上一页:
header("location: index.php");
问题:
页面“remove_items.php”可以在源代码中查看,因此任何人都可以通过任何商品ID来调用它来破解我的页面。
可能的解决方案:检查该项目的所有者是否是进行删除查询的同一用户 - 这可以吗?其他建议?
答案 0 :(得分:4)
通过GET调用(即查询字符串中的参数)执行任何写入,更新或删除操作通常是一个非常糟糕的主意。你找到了原因。
我建议使用POST以及适当的表单安全措施,用户身份验证和授权控制等。
查询字符串(GET请求)中的参数通常适用于您具有读用例并且您希望最终用户能够直接将结果视图添加为书签的情况(即查看在查询中传递了产品ID的产品页面)字符串或类似的。)
答案 1 :(得分:2)
1)考虑重命名您的文件,就像有人在您的网站上作为购物者一样,并且看到文件的名称,他们知道或者可以很容易地弄清楚文件正在做什么。建议将其重命名为不太明显的东西。
即:
item_count.php
2)如Mike Brent所述,GET对容易和简单的滥用行为持开放态度,但虽然他对POST的建议更好,但除非采取适当的措施,否则仍可能会被滥用(见下文3)。
3)会话和舆论。
每个购物单元(购物车,用户)应该有一个关联的SESSION
用于他们的浏览器数据,不真的要存储数据本身,但要防止CSRF和类似的活动欺骗您网站的另一部分在您网站的另一部分。
因此,您可以将链接包装为具有各种隐藏字段的POST
表单,一个字段应该是一个键值,这是每次加载页面时生成的唯一引用,此引用是存储为SESSION
然后保存为密钥,然后接收页面(删除产品)可以匹配表单中的密钥与SESSION
中的密钥匹配。这对防止CSRF大有帮助。
以及此,您希望另一个隐藏字段包含要删除的项目的id
,当然。
...但ID应该不是产品 ID,而是用户购物车表行中行ID 。因此,当页面删除行时,它使用交叉引用的会话ID;因此,您为产品获取POSTED
值,然后检查此值 AND 此购物车的会话值(从未向用户或其浏览器显示)与行匹配数据库,如果匹配,则删除该行(或根据需要对其执行任何其他操作)。
表产品:
Product ID
product Name
...
表格推车
Cart Id
Cart SESSION_id
Cart UserAgent *see below*
表CartRow:
CartRow Id
Cart Id
Product Id
Quantity
所以我们所拥有的是购物者购买的东西,它生成(如果尚未存在)购物Cart
行,其中包含其唯一的会话数据(从未向浏览器显示),以及哈希(password_hash
用于PHP或类似的)用户代理与其IP连接[以公平地识别其代理(虽然不完美)]。需要使用useragent / IP哈希来限制session hijacking的可能性。
所以,然后将产品添加到他们的CartRow
并引用他们的购物车ID和产品ID,然后当您提交表单以删除产品(或执行任何其他购物篮操作)时,一个查询请求,用于检查SESSION id
和useragent
字符串哈希值是否匹配,如果他们确实获得购物车ID ,则然后查看{ {1}} CartRow
ed CartRow Id 的表格,其中包含POST
的行,一旦找到该行,bingo,您已对该操作进行了身份验证,因此它是99.999%安全可以执行和删除/添加/编辑他们的产品。
答案 2 :(得分:1)
php中的会话
会话是一种存储要在多个页面中使用的信息(在变量中)的方法。会话在 $_SESSION['del_id'] = $_POST['del_id'];
的临时目录中创建一个文件,其中注册server
和他们的价值被存储。
会话在用户丢失浏览器或离开网站后结束,服务器将在预定的一段时间后终止会话,通常持续30分钟。
我的解决方案对于访客和注册的人来说都是一样的, 如果是客人,则会有临时身份证,并且会有一个永久性身份证件。
session variables
变量仅在服务器中可用,因此使用该变量进行身份验证可以安全地防止黑客入侵。