关于系统中的数据隔离问题
假设有一个文章管理系统,系统中有多个用户,每一个用户可以查看,编辑和删除自己创建所创建的文章,文章的id是sid。
<td><a href="see.php?sid=<?php echo $rs->sid; ?>"><img src="see.png" /></a></td>
<td><a href="edit.php?sid=<?php echo $rs->sid; ?>"><img src="edit.png" /></a></td>
<td><a href="list.php?sid=<?php echo $rs->sid; ?>&action=del" onclick="return confirm('真的要删除?')"><img src="delete.png" /></a></td>
  上面是一个列表页面中的数据,当用户点击see.png的时候可以查看,这时候页面会跳到一张诸如http://www.example.com/see.php?sid=423的页面上;点击edit.png的时刻可以编辑,这时候页面会跳到一张诸如http://www.example.com/edit.php?sid=423的页面上;同样还可以删除。这张页面在显示数据的时候可以只从数据库中查出该用户所创建的文章,咋一看,只要用户正常操作,系统也不会有问题,但是哪一天要是用户不通过页面点击而在浏览器的地址栏中把sid后面的参数改了,改成sid=479,这样页面就跳到了http://www.example.com/edit.php?sid=479的页面上,而这个文章恰好不是该用户,而是属于用户B的,当该用户修改了用户B
的文章之后,用户B登录系统时发现自己前几天辛苦完成的文章完全变了样,顿时万念俱灰......我的初步想法是,在查看,编辑,或者是删除的时候先查询数据库,校验该文章是否是该用户创建,如果是则允许查看,编辑,或者是删除。否则提示操作异常
用户登录的时候在session中保存用户的userid
select count(*) from wenzhang where userid = $_SESSION[userid] and sid = $sid
但是感觉这个方案不是很好,会产生很多代码,想问问各位高手们是怎样设计来避免这个问题的。

解决方案 »

  1.   

    首先要保证传过来的sid是正整数 intval()...
    其次:每个人用户登录如果你保存了标识用户的id
    你可以这样实现:
    <td><a href="see.php?sid=<?php echo $rs->sid; ?>&user_id=<?echo 你保存的session值?>"><img src="see.png" /></a></td>
    .....
    然后再修改页面获取user_id 再和保存的session 进行对比...
    如果相同.则执行功能.
      

  2.   

    谢谢你的回复,但是这样也还有一个比较棘手的问题就是:比如说正常的url是:
    see.php?sid=123&user_id=5
    如果用户将sid在地址栏中将其改为:
    see.php?sid=999&user_id=5
    而999这条文章也存在而且是其他人创建的,那么用户就可以在其他人不知情的环境下修改别人的文章