没有用到InnoDB,能不能解决这个安全隐患

天降大任于斯 2009-05-09 03:00:42
逻辑是:
查询表A,看是否符合条件
符合条件,执行正常逻辑,把表A的条件修改成否

现在遇到的问题是,表A的条件修改还没执行完,下一条语句又来了,导致执行了N次正常逻辑
这个地方该怎么控制呢?

比如说csdn的这个每天登陆一次送可用分,应该是查询一个最好活跃时间,如果最后活跃时间不是今天,说明是第一次登陆,送分,然后更改活跃时间

如果页面刷新足够快,还没有执行完更改活跃时间又刷新了一下,导致送了两次分,在非InnoDB的结构中怎么实现控制
...全文
82 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shishirui 2009-05-12
  • 打赏
  • 举报
回复
5楼,我说的不是事务,重点在于行锁
strayly 2009-05-12
  • 打赏
  • 举报
回复
这种情况应该很少出现吧,不过可以设置个session变量来表示状态,
在查询之前设置状态为1,查询之后,更新可用分或其它操作完成再把状态设为0
如果状态为1时再刷新,就提示系统忙
海诗美妆 2009-05-11
  • 打赏
  • 举报
回复
这个问题跟事务处理没有关系,也就是说,换成InnoDB也解决不了你的问题。

此问题应归属于重复更新问题,例如,注册用户的时候,insert语句在“注册完成画面”执行的情况。
一次注册完成,在“注册完成画面”刷新浏览器,只是相同用户信息重复注册的漏洞,这都是相近的问题。

-治标的解决方法:
链接或者按钮使用JavaScript控制,默认状态下有效,如果被按下一次就让其失效。
此方法实现起来比较方便,缺点是治标不治本。不过,对于大多数网站已经够用了。

-治本的解决方法:
1.在form中镶入hidden的标示字串,在同一session内,做过更新处理之后,更换此字串。
2.更新处理时,客户端发送的标示字串跟session内保存的字串不同,就禁止处理,相同则允许处理。
此方法如果没有框架支持,实现成本比较高,但是最根本的解决办法。
shishirui2 2009-05-10
  • 打赏
  • 举报
回复
用行锁,锁定记录,就可以

先 select * from table for update

然后再使用update

注意这两个操作要放在事务中
wang_quan_li 2009-05-09
  • 打赏
  • 举报
回复
已经做了防刷新
应该网 2009-05-09
  • 打赏
  • 举报
回复
没遇到过这样的情况,自己写的程序也没出现过这样的情况。

可以用相应的脚本限制刷新和短时间内重复查询。

还有,你举的例子中送分和更新最后登录时间可以是同一时间进行的(更新一个表中的数据)。如果是两条sql查询,那几乎也是同一时间进行的,又怎么会反复执行呢。第二次判断的时候就不会送了
lonelyriver 2009-05-09
  • 打赏
  • 举报
回复
境界还不够 帮你顶

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧