我有一个用JavaScript和HTML5 canvas标签编写的简单游戏。我正在使用AJAX将数据发送到服务器并相应地更新数据库。我遇到的问题是,我正在验证服务器端的所有内容,用户只需在AJAX请求中发送ID,所有内容都根据ID进行。
我很高兴,我遇到的问题是,用户可以根据自己的喜好操纵数据并发送错误数据(例如发送其他人的ID),服务器将处理这些问题。所以,如果说,我在我的账户上,我像往常一样将ID发送到服务器,一切都很好,现在说有人知道我的身份证,或者我告诉他们,然后他们发送了。
他们都可以同时发送ID并且它会起作用,因为执行任务的ID是有效的,但是两个用户不应该将数据发送到服务器。
在我的数据库中,我有一个' LoginSession' table,用于存储用户ID,登录日期,退出日期和IP。因此,当用户登录时,我会存储他们的IP。
所以我打算解决这个问题的方式基本上是,当他们向服务器发送ID时,我会检查他们当前的IP是否是他们登录的IP,如果不是,那么东西。
那么就我现在的实际问题而言,这是一个很好的方法吗?他们的IP会因任何原因在会话期间更改,还是用户可以更改其IP以匹配现有IP?一切都存储在数据库中,一切都在服务器端验证,我唯一的问题是基本上,用户可以"多日志"并且作弊以获得更快的分数。
答案 0 :(得分:1)
您应该在游戏会话开始时创建一个哈希值,将其存储为cookie并使用它。它可以基于时间戳和用户实际ID之类的内容。然后,您可以使用播放器IP地址强制执行此操作。如果散列与IP不匹配,则挑战用户,可能强制用户再次登录,或者使旧散列无效并为用户创建新散列。确保您只有一个播放器为该用户提供数据。
另外,我不会单独信任IP,因为它可能被欺骗或改变。您还必须考虑到许多玩家可能共享相同的IP地址。
您还可以从User-Agent检索客户端系统的基本详细信息(例如操作系统和浏览器版本)。当您在IP旁边创建哈希存储这些详细信息时,只要其中一个详细信息不匹配,就会使哈希无效。这将迫使黑客不仅欺骗IP,还会欺骗他的浏览器(或者与客户端设置相同)。
答案 1 :(得分:0)
尝试使用会话cookie来实现此目的。
答案 2 :(得分:0)
基本上通过IP检查可能会有效。但它不可靠,因为IP可能会因为一系列不同的原因而改变(取决于ISP网络实施,例如NAT,PAT,代理等)。
据我所知,没有人可以在没有先登录的情况下玩游戏。因此,当他们登录时(使用用户名和密码),您可以将它们与UNIQUE生成的SESSION ID相关联,通过该SESSION ID可以识别特定用户(通过USER ID)是否已登录并将其保存在DB上。 然后,在每次登录时,您将检查是否尝试使用已登录的某个用户(用户ID)登录(通过检查数据库),并且您将拒绝它(拒绝来自同一用户的多次登录)。 此外,很可能您需要创建一些预定作业,以在指定的时间内过期(删除)非活动会话。