我最近创建了两个页面,front-end.php和back-end.php。front-end.php在鼠标点击时将一些数据发布到back-end.php(我目前正在使用ajax)。
现在,如果我使用Fiddler,那么我也可以将数据发布到back-end.php。我不希望这种情况发生。我该怎么办?
我在网上搜索答案,找到了一个词"设置用户代理",但并没有给出明确的解决方案。
关于我想要什么,实际上我不希望一些机器人或其他类型的自动程序从某个来源获取一些数据并将其发布到我的back-end.php。我想确保用户来到我的网页,然后发布一些数据。
User Agent是浏览器发送到web服务器的标头,每个请求都标识自己。在这里你可以看到它是什么样子。
Fiddler发送"*"或"Fiddler"作为用户代理,所以您可以忽略具有这些值的请求。然而,这远不是解决问题的最佳方案,因为用户可以简单地通过发送她喜欢的任何内容来欺骗用户代理标头。
另一个不安全的条件是检查referer。因此,除了来自"frontfront.php"的请求外,您可以忽略所有请求。请记住,这也可能被用户欺骗。
您还应该记住,由于用户可以使用浏览器向网络服务器发送数据,因此没有什么可以阻止她使用任何其他方式发送数据或提出请求。
一般来说,网络开发人员应该尊重用户的自由,而不是强制使用这种策略,所以请更具体地告诉我们你想要解决的真正的问题是什么,并且可能存在更优雅/安全的解决方案。
编辑:如果你不想让爬网程序索引你的部分/所有页面,你应该把它们添加到robots.txt文件中。
关于所有其他自动化/程序,恐怕没有完美的方法来确定请求是来自人类还是机器人。我会做两件事:a)确保将验证规则添加到我的后端;b)作为最后手段,实现CAPTCHA测试。
只有在绝对必要的情况下,我才会使用CAPTCHA,因为它会激怒大多数用户,让他们的生活变得困难。
您应该添加一些内部机密的哈希和您想要发送的值。因为你是唯一一个知道如何制造散列的人,所以小提琴手不可能知道如何创造秘密。
例如,你制作了一个散列"asdflj8#######GJlk",由你表单中的任何值连接。现在黑客无法更改表单。问题是,你可以从另一个地方发布相同的值(使用相同的散列)。为了防止这种情况发生,你应该确保所有哈希只能使用一次。黑客现在唯一能做的就是从fiddler发布你的请求,而不是从你的网站发布,但不能同时发布。作为最后一步,您可以添加一些内容作为时间限制
所以你需要的是一个散列:
- 秘密
- 一种使hash一次性使用的方法
- 一种使hash时间受限的方法
将其添加为字段。具体实施仅作为练习;)
我不会使用user_agent,这些很容易伪造。
(这些方法与支付提供商用于确保数据(例如,要支付的金额!)不被篡改的方法相同)
最简单的答案是浏览器能做的任何事情,Fiddler都能做。它可以使用任何想要的值发送任何想要的头。
如果你的目标是能够将一些值从一个页面传递到另一个页面,而不需要任何人更改它们(无论是浏览器还是Fiddler),那么你就使用消息验证码(数据的签名哈希)。
ASP.NET为其"ViewState"数据在中构建此功能;看见http://msdn.microsoft.com/en-us/library/system.web.configuration.pagessection.enableviewstatemac(v=vs.110).aspx
然而,这完全阻止了客户端(例如您的JavaScript)更改值;如果JavaScript可以更改值,则意味着它有密钥;如果它有密钥,则Fiddler也有。