【问题标题】:Best way to authenticate client side JavaScript events验证客户端 JavaScript 事件的最佳方式
【发布时间】:2013-03-08 06:58:34
【问题描述】:

所以我有一个 JavaScript 和 php 网络应用程序。在我的应用程序中,有时 JavaScript 会调用创建帖子的 POST 请求。我想知道验证我的请求以防止任何人访问该 URL 的最佳方法是什么。它不需要那么灵活。我不会有多个应用程序。我只需要 php 和 JavaScript 中的单一案例解决方案。

编辑:第二个问题。只是确保请求来自的 URL 足够了吗?

【问题讨论】:

  • 可能应该尝试查看像 node.js 这样的服务器端 javascript。
  • @DipeshParmar — 由于数据必须来自用户,这是不切实际的。 (除非 OP 希望网站上的所有内容都由马尔可夫文本生成器而不是人类编写)。

标签: php javascript ajax authentication http-post


【解决方案1】:

你不能。

您可以在来自 JavaScript 的请求中添加额外的标头,但由于您必须将有关如何执行此操作的说明发送到浏览器,因此任何人都可以阅读并复制它们以用于自定义构建非 JS 请求。

在 WWW 上,您可以对人员进行身份验证(使用凭据),但您无法对客户端进行身份验证(除非您以编译包的形式提供客户端软件……即使这样也不可靠,官方的 Twitter 客户端身份验证密钥已失效现在在野外)。

只是确保请求来自的 URL 足够了吗?

如果您的意思是“检查引用标头”,那么没有。这是由客户端设置的,客户端可以设置为他们喜欢的任何值。

【讨论】:

    【解决方案2】:

    最好的办法可能是建立一个 PHP 会话并将存储在 $_SESSION 中的标识发送到 javascript。在每个 AJAX POST 中,您添加此标识并将其在服务器端检查到存储在 $_SESSION 中的内容。如果它们不匹配,则可能是有人试图操纵 URL 或 CSRF。

    如果您想阻止原始客户端在一个会话中执行多个请求,您需要从服务器向客户端发送一个只能使用一次的通知号。看: http://en.wikipedia.org/wiki/Cryptographic_nonce

    【讨论】:

    • 尽管如此,所有这些数据仍会发送到客户端,因此它可以用于客户端想要的任何目的。
    • 使用 nounce 他们至少只能执行一次。他们必须“请求”向服务器发送 POST 的权限。这样您就可以控制允许客户端执行的操作,并在没有适当通知的情况下直接忽略请求。
    • 虽然请求许可是另一个步骤,但仅此而已。它可以像其他任何东西一样轻松地实现自动化。
    【解决方案3】:

    您可以将此行放在脚本顶部

    <?php  if ( ! defined('BASEPATH')) exit('Permission denied: direct access');
    

    作为您将 POST 发送到的 php 文件的第一行。

    编辑 -> 或类似

     if(!isset($_POST))
       {
          die('no direct access allowed');
       }
       else
       {
    
         //all your PHP code
    
        }
    

    你也可以在帖子中包含你自己的变量并在

    中使用它

    isset($_POST['你的变量'])

    检查。

    【讨论】:

    • 目标是在人们不使用 JS 请求时阻止他们访问该页面,而不是仅当 include()ed 在另一个页面中时才使其可访问。
    • 是的,谢谢昆汀。我想答案中的 EDIT 应该可以达到目的。
    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 2011-11-15
    • 2015-04-26
    • 1970-01-01
    • 2011-04-05
    • 2012-05-25
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多