Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 独特用户投票策略,如Stackoverflow';s_Php_Zend Framework_Spam Prevention_Voting - Fatal编程技术网

Php 独特用户投票策略,如Stackoverflow';s

Php 独特用户投票策略,如Stackoverflow';s,php,zend-framework,spam-prevention,voting,Php,Zend Framework,Spam Prevention,Voting,我注意到for voting SO实现了一个XHR方法,该方法发布到POSTs控制器,并通过URL发送post ID和投票类型,此外还发送了一个fkey参数,例如: http://stackoverflow.com/posts/1/vote/2 我将要实现一个类似的技术,我想知道除了实现这个技术时的总体逻辑之外,我还可以使用什么样的逻辑来防止同一用户的重复投票和防止垃圾邮件 我将存储它们的表的架构: thread_id user_id vote_type 2334 1

我注意到for voting SO实现了一个XHR方法,该方法发布到POSTs控制器,并通过URL发送post ID和投票类型,此外还发送了一个
fkey
参数,例如:

http://stackoverflow.com/posts/1/vote/2
我将要实现一个类似的技术,我想知道除了实现这个技术时的总体逻辑之外,我还可以使用什么样的逻辑来防止同一用户的重复投票和防止垃圾邮件

我将存储它们的表的架构:

thread_id   user_id   vote_type
2334        1         2
到目前为止,我提出了以下要点:

  • 确保用户已登录
  • 确保发送了有效的帖子ID和有效的投票类型
  • 确保发布后,用户以前没有投票
  • 创建散列的代码不能包含诸如用户代理之类的动态信息,因为用户可能位于不同的浏览器、不同的操作系统上,对吗
更新:


“所以可能是使用登录cookie来识别用户。”-Andrew

是否有人可以演示如何执行此操作,或者更具体地说,提供如何生成字母数字32位字符串的
fkey

问题:

  • 由于我没有使用XHR代码将实际用户id发送到任何地方,这是否意味着我必须更新我的表架构,以便存储
    fkey
    ,而不是
    用户id
    fkey
    可能必须对每个用户都是唯一的,因此我可能可以查询投票表中是否有一行具有任何fkey

如果您对任何实施过类似技术的人有任何建议或见解,我们将不胜感激。

您可以以某种方式对URI进行签名,以防止用户操纵价值。例如,您可以使用一个秘密对URI的部分进行散列,并将散列附加到URI中。当用户复制URI并更改值时,URI和签名部分将无效


这通常是在RESTful API中完成的,您当前的方法与类似。

我认为这取决于您多么希望人们不要重新提交或篡改您的数据。没有什么会是100%(除非你的预算超过了上限),但你可以通过以下方式很好地阻止大多数人重新提交:

  • 检查他们的UID-或从UID生成的ID(我将解释)
  • 记录他们的IP地址,并对照数据库检查IP和提交ID(以及生成的UID)

单独使用IP解决方案,当然可以通过使用代理或经常改变IP的连接(例如我所在城市的DSL运营商)来解决问题(但即使如此,每隔几天就会发生一次)。我个人根据这个UID生成一个唯一的密钥,并在必要时将其传递回第四个。咸MD5散列通常可以正常工作,如果MD5被认为太弱,甚至可以使用AES实现。结合起来,你应该有一个好的起点

在字段(thread\u id,user\u id)上创建唯一索引,DBengine将保护您免受一个线程上的多条评论:)

为什么不使用XHR代码将实际用户id发送到任何地方?我注意到SO没有使用它,可能是出于一个很好的原因。。你可以创建一个自定义表单,在用户id字段中添加一个值,然后发布它,这将是一个有效的请求,不是吗?但是,如果您使用类似于
fkey
的东西,很可能没有人能够对其进行反向编程以获得基于用户的相同哈希值,这就是为什么我认为如此使用此方法的原因。因此,可能是使用登录cookie来识别用户。我和Firebug进行了检查,Cookie正在发送。这个逻辑不是在您的数据库中部分实现的吗。我投了很多不同的票?如果用户ID在该帖子的投票表中,则不允许额外的投票。如果被否决,则从投票表中删除条目。对于像我这样的白痴:XHR=xhmlhttprequests,您可以在此上下文中包括md5加一个salt的示例,以及用户id吗?$new\u uid=md5($user\u name.“这是我的salt”);使用$new_uid,您可以将此值存储到每个成员唯一的数据库中。当然,我假设每个成员都已经有了一个唯一的ID,比如一个电子邮件地址,这是基于它的(对于$user\u name)。然后,您可以对他们的ip执行查询-$ip=$\u服务器['REMOTE\u ADDR'];以及使用salted MD5哈希生成的唯一ID。它不是完美的,但却是一个工作的基础。