原型请求Ajax.Updater每个请求的安全/身份验证

时间:2011-02-01 16:00:28

标签: php javascript prototypejs validation

我的网站包含Prototype Framework并用PHP编程。 (我知道非常非常基本的javascript)

网站普通访客&其行动

有些类似于keepvid .com

A)有一个输入框,用户放置链接,然后按提交。 (?var = userfoo通过原型框架工作执行)(请求被发送到同一页面action = index.php)

B)它显示加载gif而不是显示结果默认情况下隐藏它并根据请求显示。

C)现在不刷新或重新加载父窗口html(主页面)。

D)用户再次放置链接并按提交它执行相同的b c过程。

每件事都在工作,但我在检查日志时会注意到问题。 有些人使用脚本来获取输出。不是普通的访客,你可以说或是leechers。

问题:

1)但是如果有人在浏览器中输入http:// url?var = foo& var = bar,它将生成div的输出内容,这意味着没有主页访问。任何人都可以通过查询并直接获得结果。

2)我尝试使用会话令牌但它失败了,因为它在div中重新生成。还没有刷新父级,因此会话令牌不匹配(这只是带有AJAX REQUEST 1请求输出正常但第二次请求失败,因为父令牌相同。并且提交按钮使用相同的令牌)在纯PHP上它可以刷新页面,但我不想刷新页面。我只是想显示加载gif。

3)任何人都可以使用curl php并抓住页面。所以我想要一个Javascript验证(HIDDEN)。如果失败了Javascript,那么如果失败则比启动验证码安全性更快。我不想让它在详细或通过命令行或通过其他脚本(用于获取)工作。

4)我不知道究竟是什么叫做什么。我认为他们是XHR。

我想通过

为我的网站提供安全保障

1)URL变量注入之类的 ?VAR = FOO&安培;&安培; VAR2 =巴 但也允许转换(如果有人这样做)转移页面 ?redirect = foo并加载主页并将该重定向值放入输入框

2)基于服务器的验证但在div内,必须显示加载gif并且不要重新加载整个页面..

我看的东西却失败了......

1)JCryption但它需要Jquery而不是我必须重新编码所有内容......

2)

// If the request did not come from AJAX, exit:
          if($_SERVER['HTTP_X_REQUESTED_WITH'] !='XMLHttpRequest'){
          exit;
          }

此命令因IE7浏览器而失败。 (这是唯一最好的方法,但只有一个浏览器失败)还有一个问题是,如果有人在本地主机上创建运行它将操作更改为http://myurl,而不是仍然接受它。此外,如果我们发送卷曲来发送自定义标题,那么它将无法实现目的。

3)使用JavaScript加密和PHP解密。有些JS要enrypt和php函数来解密。 (通过使用隐藏表单元素输入) 这也是一个很好的方法,但我很难编辑源传递变量,我的意思是从div到服务器。

也使用了其他一些方法,但我认为所有上述方法都是最好的描述我的问题... 请理解,解决方案可能非常小或大,但我不太了解JavaScript那么精心制作。

1 个答案:

答案 0 :(得分:0)

您需要nonce

  • 生成随机值并将其存储在会话变量中。

    session_start();
    $_SESSION['nonce'] = base64_encode(md5(mt_rand()));
    
  • 将该值用作表单中的隐藏元素,或将其作为参数添加到AJAX URL。

    <input type="hidden" name="nonce" value="<?php echo $_SESSION['nonce'] ?>"/>
    
  • 将会话中存储的值与AJAX请求的值进行比较。如果失败则通知403浏览器错误。

    session_start();
    if ($_GET['nonce'] !== $_SESSION['nonce']) {
        header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden');
        die('Forbidden. Please check your cookies and try again.');
    }
    
  • 仅在成功时更新页面。

    new Ajax.Updater({success: 'ELEMENT ID'}, 'AJAX URL');
    
  • 如果检测到错误,更新程序将失败并且不会进行任何更改。