2012-11-13 80 views
2

我网站上的用户可以点击按钮。如果他们这样做,他们将获得积分奖励。防止用户滥用javascript代码

这个按钮,当点击时,正在向服务器发出AJAX调用以给予奖励(存储在数据库中)。

该按钮是一个“发推”按钮,所以我想确保他们真的在做推特的事情。

我的问题是我想确保按钮确实被点击。由于JavaScript代码完全可以被用户看到,所以我想他们很容易在没有点击的情况下进行AJAX调用。

那么,我能做什么?混淆是我唯一的选择,还是我可以加密某些东西,或使用标记或其他东西?

如果可能有所帮助,用户登录并且页面与PHP一起提供。

感谢

+1

可以多次点击按钮来总结奖励吗?奇怪的概念......否则问题在哪里?没有人关心按钮是否被鼠标指针或脚本按下。 – arkascha

+1

确保点只能授予一次(在一定的时间段内) - 只要按钮是获取积分的最简单方法,就没有动力以编程方式进行。 – Blazemonger

+0

我不在乎按钮是否按下多次。很容易禁用它并检查服务器端。但是,我想确保按钮已被点击,并且它不是一个脚本来打电话。 – Jean

回答

3

基本上你是出好运 - 没有万无一失的解决方案可以防止某人编写一个简单的脚本来下载页面,解析它以获取任何安全令牌,然后调用AJAX请求。

您只能通过添加一些由服务器呈现并通过AJAX调用返回的附加数据来使作业稍微难一些。

您可能会考虑在按钮中添加一个CAPTCHA图像 - 这会阻止漫游器提交数据,但也会让真实用户的生活更难。

+0

好的,谢谢。验证码会对用户造成严重的影响(要求他们发一条推文和一个...验证码,但不会这么做),但我认为你几乎总结了它。 – Jean

+0

您可以允许用户(通过IP或用户名)在Y分钟内制作X个请求,如果他们想要制作更多内容,则可以显示验证码。 –

+0

是的,其他人认为,但那不是重点,因为我保留了数据库中的奖励记录(并且只允许1,服务器端)。那部分是好的。 – Jean

1

您可能需要一个CSRF token附在您的请求,可以肯定的点击已经从该页面进行,并在当前会话中。

您可以实现一个即将到期的令牌 - 您在会话中设置一次,当用户请求它时,它会失效并完成。

+0

我觉得用户将能够看到该令牌,不是吗? – Jean

+0

是的,这基本上可以防止脚本自动泄漏。看看我的关于在你的'$ _SESSION'中创建一个到期的标记的编辑。 – moonwave99

+1

@ moonwave99这不会阻止用户创建脚本来自动提交请求。 CSRF令牌阻止其他站点强制用户进行操作。它不适用OP问题。 – HoLyVieR

1

您是否只允许在特定时间范围内点击一次按钮?这可以在PHP中强制执行,并且非常安全。

即使您使用令牌或用户可能会找到它并直接运行该脚本。需要进行某种服务器验证,例如时间验证,才能真正安全。

+0

这不会阻止脚本提交按钮,否? – Jean

+0

那么,如果脚本被调用,则检查用户上次按下按钮时是否在特定时间范围内,比如说一天。如果是这样,那么不要给他们按钮通常给予他们的点。 –

0

1-看起来这些用户是您网站的注册会员。如果是这种情况,只需在数据库中创建一个表,其中包含id,用户名和其他关系列。让你的脚本request工作,如果他们以前没有得分(通过检查第一个,用户登录,然后检查用户对用户分贝,如果他们存在的关系拒绝请求否则接受它,内表)。

2-如果他们不是注册用户,请使用Google验证码进行检查。

+0

似乎用户应该能够多次获得积分。其余的很容易编写脚本(除了验证码) –

+0

@Knaģis然后关系列将处理该问题。 –

+0

非常感谢Yousuf,但我的问题不是为了防止多次提交,而是为了防止提交脚本(而不是真正的用户提交)。 – Jean

1

基本上,用户甚至可以重现令牌,严格来说不是一个完美的保护。 代码的混淆可能会有所帮助。 我认为你想防止编程或多次投票.. 你可以记录ip以防止多次投票&使用csrf令牌,但提供你的用户登录它可以推测他们是可信的,在操纵的情况下,你只需删除他们的帐户。

我认为你应该尝试使用captcha,并且确定用户谁是投票,并限制他从多个投票服务器端。

但伪造点击仍然可行。

+0

谢谢,我100%同意。 – Jean