Php Mysql删除行-安全问题

Php Mysql删除行-安全问题,php,mysql,Php,Mysql,我有一个存储在数据库中的购物车。当用户删除项目时,应将其从数据库中删除。 我想到的第一种方法是制定一个代码,如: <?php echo "<a href='./remove_items.php?id=1'>remove</a>"; ?> 问题: “remove_items.php”页面可以在源代码中查看,因此任何人都可以调用它来用任何项目ID攻击我的页面 可能的解决方案:检查该项目的所有者是否是进行删除查询的同一用户-可以吗?其他建议?通过GET调

我有一个存储在数据库中的购物车。当用户删除项目时,应将其从数据库中删除。 我想到的第一种方法是制定一个代码,如:

<?php
    echo "<a href='./remove_items.php?id=1'>remove</a>";
?>
问题:
“remove_items.php”页面可以在源代码中查看,因此任何人都可以调用它来用任何项目ID攻击我的页面


可能的解决方案:检查该项目的所有者是否是进行删除查询的同一用户-可以吗?其他建议?

通过GET调用(即查询字符串中的参数)执行任何写入、更新或删除操作通常都是一个非常糟糕的主意。你已经明白了原因

我建议使用POST以及适当的表单安全措施、用户身份验证和授权控制等


查询字符串(GET requests)中的参数通常对以下情况非常有用:您有一个读取用例,并且希望最终用户能够直接将结果视图添加到书签中(即,使用查询字符串或类似内容传递的产品id查看产品页面)。

php会话
会话是存储跨多个页面使用的信息(变量)的一种方式。会话在
服务器上的临时目录中创建一个文件,其中注册了
会话变量
,并存储了它们的值。 当用户丢失浏览器或离开站点后,会话结束,服务器将在预定时间段(通常为30分钟)后终止会话。

我的解决方案对客人和注册客人都是一样的, 如果是客人,会有一个临时身份证,如果是注册的,会有一个永久身份证


  • 在会话变量中存储用户id
  • 在删除购物车产品的页面中使用该变量检查用户身份验证
  • 如果用户有效,则仅执行删除操作
  • 由于
    会话
    变量仅在服务器中可用,因此使用该变量进行身份验证是安全的,可以防止黑客攻击
  • 考虑重命名文件,好像有人在浏览你的站点作为购物者,看到文件的名称,他们知道或可以很容易地找出文件正在做什么。建议将其重命名为不太明显的名称

    i、 e:

    item_count.php

    2) 正如所提到的,GET很容易被简单的滥用,但尽管他的职位建议更好,但除非采取适当的措施,否则它仍然会被滥用(见下文3)

    3) 会话和模糊处理。 每个购物单元(购物车、用户)都应该为其浏览器数据设置一个相关的
    会话
    ,这并不是为了存储数据本身,而是为了防止类似活动在网站的另一部分上欺骗网站的一部分

    因此,您可以将删除项目的链接包装为带有各种隐藏字段的
    POST
    表单,其中一个字段应该是键值,该键值是每次加载页面时生成的唯一引用,该引用存储为
    会话,然后另存为键,然后是接收页面(删除产品)然后可以匹配表单中的键与
    会话中的键匹配。这对预防CSRF有很大帮助

    当然,除此之外,您还希望另一个隐藏字段包含要删除的项的
    id

    …但是id不应该是产品id,而是用户购物车表行的行id。因此,当页面删除该行时,它使用一个交叉引用的会话id;因此,您为产品获取一个
    POSTED
    值,然后检查此值和此购物车的会话值(从未向用户或其浏览器显示)是否与数据库中的一行匹配,如果存在匹配,则删除该行(或根据需要对其执行任何其他操作)

    例子: 表产品:

    Product ID
    product Name
    ...
    
    餐车

    Cart Id
    Cart SESSION_id
    Cart UserAgent *see below*
    
    表CartRow:

    CartRow Id
    Cart Id
    Product Id
    Quantity
    
    因此,我们拥有的是购物者购买东西,它生成(如果尚未存在)一个购物
    购物车
    行,其中包含其唯一的会话数据(从未向浏览器显示),以及与其IP连接的用户代理的散列(
    密码\u散列
    ,或类似内容)[非常明确地识别他们的代理(虽然不是完美的)]。需要useragent/IP哈希来限制发生错误的可能性


    因此,当您提交表单以删除产品(或执行任何其他篮子操作)时,产品将添加到他们的
    CartRow
    ,并参考他们的购物车Id和产品Id,您执行一个查找请求,检查
    会话id
    用户代理
    字符串散列是否匹配,如果它们确实获得了购物车id,然后在
    购物车id
    表中查找与同样包含
    购物车id
    的行匹配的
    POST
    ed购物车id,一旦该行被找到d、 宾果,你已经验证了该操作,因此执行和删除/添加/编辑他们的产品是99.999%安全的。

    是的,检查所有者是否是删除它的人是可以的。这没什么问题。为什么购物车中的用户能够删除产品?我相信正确的方法是实施某种用户管理有了用户管理,您的服务器端PHP代码将“知道”无论请求是否来自经过身份验证的用户。是的,如果用户自己进行黑客攻击,他可以直接开始从购物车中删除记录,但另一个用户将无法执行此操作。@Mihai:用户可以改变他想买什么的想法,从而从购物车(而不是商店)中删除项目@Mihai,购物车应该是非易失性的,所以需要一个数据库。就像亚马逊一样……。当用户以后登录时,它应该在那里。适当的表单安全措施,用户a
    CartRow Id
    Cart Id
    Product Id
    Quantity