使用Javascript XmlHttpRequest和PHP保护web服务调用

使用Javascript XmlHttpRequest和PHP保护web服务调用,php,web-services,security,authentication,Php,Web Services,Security,Authentication,因此,在我想要制作的游戏中,我试图让客户端(web浏览器)和服务器之间的所有功能通过对PHP web服务的AJAX调用进行交互。这是实现此类功能的一种非常简单的方法,但它有几个主要缺点: 任何使用网络嗅探器的人都可以看到请求的格式(除非他们使用SSL)并复制它们 任何使用浏览器玩游戏的人都可以查看包含的Javascript文件,并查看提交XHR的情况 因此,为了解决第一个问题,我将使用一个到服务器的HTTPS连接(这就是我如何实现SSL正确性?),对于第二个问题,我所能想到的就是混淆/最小化我的

因此,在我想要制作的游戏中,我试图让客户端(web浏览器)和服务器之间的所有功能通过对PHP web服务的AJAX调用进行交互。这是实现此类功能的一种非常简单的方法,但它有几个主要缺点:

  • 任何使用网络嗅探器的人都可以看到请求的格式(除非他们使用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的漂亮打印,黑客也会发现您的代码很难破译。要考虑的另一件事可能是放弃把变量完全放在岗位上。这不会持续很长时间,但通过cookie(和ajax请求一起发送)传递命令会很狡猾。更隐蔽的是,您可以让PHP和JavaScript决定何时在post和cookie通信之间来回切换,或者只使用post处理非敏感的事情

    超级狡猾:将核心游戏逻辑和通信放入名为
    jquery-1.6.2.min.js的文件中。我保证大多数试图破解你的脚本的人都会忽略它

    忍者价值:如果您选择在cookie和post请求之间切换,则在未使用的传输上创建蜜罐。因此,在PHP发送响应并说“嘿,让我们转到cookies!”和JavaScript说“没问题”之后,PHP应该监听通过POST进行通信的尝试。它应该假设,既然JS正在通过cookie进行通信(目前),那么如果尝试了post请求,就会涉及到一些黑客行为。然后,它会用一条“你被逮到了”的消息吓唬用户,甚至会暂时禁止。当然,当他们切换回POST通信时,这种情况会发生逆转

    超越忍者:您还可以发送与POST/Cookie请求相同的GET请求,这些请求将被永久保存。如果GET和POST/COOKIE之间存在差异,那么黑客认为这就像更改某些GET变量一样简单,并且您可以显示相同的“您被抓到”消息,其中可能包含游戏中的临时或永久禁令


    最后几件事:

    • 利用新的网络技术。如果可用,您可以使用web套接字作为传输工具,使其成为一个蜜罐四重奏(WebSockets、POST、Cookies和GET)。您还可以使用web workers隐藏特殊代码的执行。虽然您可以为worker打开JS文件,但我不知道如何从控制台或FireBug中直接访问worker的作用域
    • 利用愚蠢的黑客对你有利。放在黑客会期待的愚蠢的东西里。如果某些安全措施看起来很糟糕或者很容易破解,黑客可能会自大或者认为你是一个糟糕的程序员。然后他们会继续搞砸像蜜罐运输系统这样的事情