php - 使用Javascript XmlHttpRequest和PHP保护Web服务调用的安全

标签 php web-services security authentication

因此,在一个游戏中,我试图让客户端(web浏览器)和服务器之间的所有功能通过ajax调用php web服务进行交互。这是实现这类功能的一种非常简单的方法,但它有几个主要缺点:
任何使用网络嗅探器的人都可以看到请求的格式(除非他们使用ssl)并复制它们
任何使用浏览器玩游戏的人都可以查看包含的javascript文件,并查看提交xhr的情况。
所以为了解决第一个问题,我将使用到服务器的https连接(这就是我如何正确实现ssl的方法?)对于这两个问题中的第二个,我所能想到的就是模糊化/最小化我的javascript代码。
有人知道我如何验证我的php文件正在使用的web服务调用吗?如果我在客户端使用用户名/pw,那么攻击者只需查看javascript文件即可找到凭据。如果我尝试使用IP地址作为某种身份验证方法,那么我觉得这只会打开一整罐蠕虫。我基本上想确保web服务调用来自游戏客户端。

最佳答案

偷偷摸摸:在游戏环境中验证用户生成内容的真实性并不容易。我建议用javascript和服务器之间发送的乱七八糟的命令来混淆命令。例如,如果要将用户的x坐标发送到服务器,而不是:

ajax.send('userXLocation=80');

尝试一些不简单的英语:
ajax.send('J{};;%FI=80');

当然不是防弹的,但是如果有一些好的JS缩小/混淆,用户将难以区分发送的命令,如果他们能理解的是数字。
在js代码中,乱码必须是硬编码的,但是在php中,可以有一个数组将乱码映射到实际的命令。
特别狡猾:不是胡言乱语,而是使用固定长度的预挂数字作为命令。用户x移动到80可能是:24080
偷偷摸摸:你也可以偶尔尝试发送一个唯一的会话标识符(类似于半公钥),并指示js使用该会话标识符对所有消息进行编码。这可能再次被破解,但它增加了任何破解尝试的时间。
额外的秘密:这个会话标识符可能是服务器最后一次响应的文本,所以每次请求都会改变,但是黑客不会看到任何明显的消息告诉js密钥已经改变。这将只是js和php之间的无害通信。
偷偷摸摸:这是另一个临时的解决方案,但是为了混淆数字,您可以决定在发送之前给每个数字加或减一个常量(可能是会话唯一的常量)。因此,如果黑客知道他在X位置80并且寻找包含80的通信,他/她不会看到任何,因为JS和PHP已经决定对每一个数字加上5。85人可以不被发现通过。
超级偷偷摸摸:与上面类似,与其同意数字混淆常量,不如使用服务器上次发送给js的数字。同样,黑客也会疑惑为什么数字一直在变化,但没有消息通知js改变它的数字。
偷偷摸摸:这也是暂时的,但当混淆代码试图将逻辑与基本内容(创建ajax对象)混合时,即使对chrome黑客来说,打印得很漂亮,也会发现你的代码很难破译。还有一点需要考虑的是,可能完全放弃将变量放在post中。它不会持续很长时间,但通过cookie传递命令(cookie将随ajax请求一起发送)会很狡猾。更狡猾的是,您可以让php和javascript决定何时在post和cookie通信之间来回切换,或者只将post用于不敏感的事情。
超级鬼祟:把核心游戏逻辑和通信放在一个名为jquery-1.6.2.min.js的文件中。我保证大多数试图破解你剧本的人都会忽略它。
忍者价值:如果你选择在cookie和post请求之间交替,那么在传输上创建一个不被使用的蜜罐。所以在php发送一个响应并说:“嘿,让我们转到cookies!”javascript说,“当然”,php应该监听通过post进行通信的尝试。它应该假设,因为JS通过Cookie(现在)进行通信,如果尝试了POST请求,则涉及到一些黑客攻击。然后,它会用一条“You're busted”消息吓唬用户,甚至暂时禁止。当然,当他们切换回后通信时,这应该会发生变化。
超越忍者:你也可以发送与post/cookie请求相同的get请求,这些请求将被永久地蜜罐化。如果GET和POST / Cookie之间存在差异,那么黑客认为它与改变一些GET变量一样容易,并且可以显示与您的游戏中可能的临时或永久禁令相同的“您被捕获”的消息。
最后几件事:
利用新的网络技术。如果可以的话,您可以使用web套接字作为传输工具,使其成为一个蜜罐四重奏(web sockets、post、cookies和get)。还可以使用Web工作人员隐藏特殊代码的执行。尽管您可以为工作程序打开js文件,但我不知道如何从控制台或firebug中直接访问工作程序的作用域。
利用愚蠢的黑客对你有利。放进黑客会想到的蠢事里。如果某些安全措施看起来很糟糕或者很容易破解,黑客可能会变得高傲或者认为你是一个糟糕的编码者。然后他们会继续捣乱,像蜜罐运输系统,并被捣毁!
最后,始终注意奇怪的请求模式。如果一个播放器的最大速度是每秒10像素,但是在两个请求中,彼此之间只有一秒的间隔,移动的距离是20像素,那么php应该知道有什么问题。您甚至可以允许php通过发送一条快速的ajax消息来跟踪消息操作和发送时间,该消息称我将向您发送一条消息。如果用户篡改了实际消息,则第一条消息和包含数据的消息之间的时间将在数秒内变化。php可以注意到这一点,因为计算机处理数据和发送ajax请求通常不需要5秒以上的时间。

关于php - 使用Javascript XmlHttpRequest和PHP保护Web服务调用的安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6848233/

相关文章:

java - 如何处理 REST 服务中的无效参数?

php - Laravel-5,将角色与用户关联

php - 使用 SimpleXML 从头开始​​创建 XML 对象

java - 从 java 1.4 调用 .NET Web 服务

c# - ...可能不会在这种情况下使用...而序列化

iPhone模拟器自定义CA证书

php - Fullcalendar 动态设置 minTime 和 maxTime

php - jason lewis basset 在 laravel 4 中没有很好地显示图标

security - 使用 liferay 启动 tomcat 8 时存在严重的安全限制

c# - 如何让我的产品成为 30 天的试用版?