在一点时间差内检测从同一客户端发送到php的类似请求
我有一个php脚本,它从flash中的一个按钮接收$['post']数据,有时用户双击该按钮,数据发送两次,这会导致服务器端的mysql更新冲突。在一点时间差内检测从同一客户端发送到php的类似请求,php,mysql,Php,Mysql,我有一个php脚本,它从flash中的一个按钮接收$['post']数据,有时用户双击该按钮,数据发送两次,这会导致服务器端的mysql更新冲突。 我怎么能在短时间内忽略来自同一客户机的php进一步请求呢?为什么不在数据库中设置一个上次更新的时间戳,然后对照当前时间进行检查呢。如果是在最后几秒钟,则不要运行MySQL查询。您可以添加基本的保护机制,因为您可以向表单中添加一个隐藏的随机值,并维护一个显示值表,在执行主查询之前从中删除使用过的值。这也可以防止XSS。你听说过吗 如果您不提供更多详细信
我怎么能在短时间内忽略来自同一客户机的php进一步请求呢?为什么不在数据库中设置一个上次更新的时间戳,然后对照当前时间进行检查呢。如果是在最后几秒钟,则不要运行MySQL查询。您可以添加基本的保护机制,因为您可以向表单中添加一个隐藏的随机值,并维护一个显示值表,在执行主查询之前从中删除使用过的值。这也可以防止XSS。你听说过吗 如果您不提供更多详细信息,就不可能提供详细示例,但基本示例是:
mysql_query( "LOCK TABLES updates READ WRITE", $connection);
$q = mysql_query("SELECT COUNT(*) FROM updates WHERE user = $currentUser AND time...");
if( mysql_result($q, 0, 0) != 0){
// Someone's already doing update; exit
mysql_query( "UNLOCK TABLES;");
return false;
}
// Require lock for ourselves
mysql_query( "INSERT INTO updates ...");
mysql_query( "UNLOCK TABLES;");
// Do the stuff on database
这确保了当同一用户尝试两次时,他或她将不被允许(一次只进行一次更新)
您还有不同的选择:
- 使用
- 生成用于更新的一次性令牌(注意原子性,您必须执行
,然后检查受影响的行,因为DELETE FROM…
my被中断,或者您必须再次使用表锁定)SELECT;DELETE
- 我最喜欢的一个按钮是:
,根据请求完成按钮。enable=false
按钮。enabled=true
注意:该代码易受SQL注入攻击,并且您的
mysql\uu
功能已过时。我想在第一次提交后禁用flash中的按钮会更容易。您是对的,但我无法访问flash文件什么样的更新冲突?您已经考虑过了吗?可以在$\u会话变量中设置它,以查看它们最后一次成功插入数据库的时间。如果他们再次提交,但没有足够的时间,这将阻止插入。。。只是一个想法有没有任何锁定模式可以防止同一用户更新表?@manfilsoof没有,这就是为什么表被锁定的时间尽可能短的原因。在再次解锁表之前,这只有2-4个数据库查询可能非常快(提供正确的数据库设计和索引使用)。试着对它进行基准测试或测量估计的时间:)我相信这是相当普遍的做法。