【问题标题】:prevent fake request in php and jquery防止 php 和 jquery 中的虚假请求
【发布时间】:2017-11-23 17:35:09
【问题描述】:

我有 $.post jquery 代码在客户端汇总我的表单。当我在 chrome 控制台上执行自定义 jquery 时,服务器正常工作。我认为它不安全,因为任何人都可以在他们的控制台上编写 jquery 并访问我的网站。如何预防这个问题? 有什么方法可以知道请求是否来自我的网站或不在服务器端?我在 SO Prevent fake looping ajax requests to PHP 中发现了类似的问题,但我不明白如何解决我的问题。

【问题讨论】:

  • 听起来您对 Web 请求的工作方式有一些重大误解。你应该读一读:learn.userfrosting.com/background/…
  • 永远不要相信任何输入。验证(是否为登录用户)、验证(数据是否符合您的预期)和速率限制(仅允许在一段时间内限制请求数量)
  • @NyeinChan:好的,那你的问题是什么?当用户提交一个有效的请求时,它会被保存到数据库中。为什么这么糟糕?
  • @NyeinChan:如果在短时间内提交许多请求无效,那么听起来服务器没有执行您想要的所有验证。也许你想要的是验证码或类似的东西?也许您想在处理请求时向服务器端代码添加更多验证逻辑?您需要确定的具体是您要防止的,然后采取措施防止它。试图阻止用户使用他们的网络浏览器的调试工具不是这些步骤之一。
  • @NyeinChan Google 术语“速率限制”和“节流”。这与 jQuery 无关——有人可以通过多种方式在短时间内提交大量请求。见owasp.org/index.php/Blocking_Brute_Force_Attacksowasp.org/index.php/Denial_of_Service

标签: php jquery


【解决方案1】:

CSRF Token 的想法是解决您的问题的常用方法。创建一个包含一些重要信息的脚本代码,您可以验证代码是一种开始方式,加上添加一个 UID(并且在服务器端也需要 $_POST['uid'] 的存在,这基本上是当前时的时间戳请求已发送。

关心浏览器的控制台是没有用的,主要关心的是你的服务器端构建得有多好,仅此而已。客户端永远不必对您的系统拥有大权限,并且必须明确定义要通过的过滤器。

例如,如果调用的函数/例程也需要一些参数,请检查 $_POST 中是否存在这些参数,强制类型,当你强制作用域时,你会使错误请求变得更加困难,因为坏人需要很好地了解您的业​​务规则,加上前面的安全提示,这是一个好的开始。

【讨论】:

  • 如何将此类参数放入我的请求中?现在我正在使用一些静态键来形成提交请求。我想要那个动态的密钥,并且只理解我的服务器端脚本。
  • 一些使用特定的算法来生成 UID(我强烈推荐这种方法):stackoverflow.com/questions/6248666/… 其他人只是照我说的做:使用 javascript 当前时间戳 Date.now();
  • 你编辑,你编辑我的答案:当你生成你的 html 表单时,只需从服务器端带来已经生成的 CSRF 令牌(输入隐藏等),然后用 javascript 将他发送到你的 ajax ,在执行任何例程之前验证到您的服务器端。
  • CSRF 令牌正在验证对您视图的每个请求,因此您的服务器可以“理解”它。无论如何,你对我的回答 @NyeinChan 投了反对票吗?
  • @duongkhang 您最初的回答帮助我更快地给出答案。顺便说一句,代码混淆会导致一些问题,我更喜欢缩小它们,而且,如果 Nyein 需要性能,代码混淆也会有缓存问题。 stackoverflow.com/questions/194397/…
【解决方案2】:

如果您愿意,可以查看 CSRF 令牌,该令牌将与表单一起提交,以检查此请求是否来自我们的网站。

另一种方式,您可以混淆您的 JS 代码,以防止人们接触到“原始代码”并对其进行破坏。无论如何,您可以使用令牌和混淆之类的东西来防止人们对您的服务器做出“坏事”,如果他们想入侵您的服务器,您无法阻止他们,所以尽可能地保护它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多