2011-02-01 60 views
0

我的网站包含原型框架并使用PHP进行编程。 (我知道非常非常基本的JavaScript)原型请求Ajax.Updater每个请求的安全/认证

网站正常游客&其行为

有些什么类似KeepVid一样.COM

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

B)它显示加载gif比它显示结果默认情况下它隐藏并显示请求。

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

D)用户再次把链接,并按提交它做一个相同的过程。

每件事情都很有用,但我在检查日志时发现问题。有些人使用脚本来抓取我的输出。不是普通的访问者,你可以说或者是leechers。

问题:

1)但是,如果有人放HTTP:在浏览器// URL VAR = foo的& VAR =栏就会生成div的输出内容,这意味着无主网页的访问。任何人都可以通过查询并直接得到结果。

2)我尝试使用会话令牌但它失败,因为它在div中重新生成。也没有刷新父级,所以会话令牌不匹配(这个只有与AJAX请求1的请求给出输出没关系,但第二个请求由于父令牌相同而失败,并且提交按钮使用相同的令牌)在纯PHP它的工作原理是刷新页面,但我不想刷新页面。我只是想显示加载gif。

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

4)我不确切知道这些东西被称为什么。我认为他们是XHR。

我想从我的网站提供安全

1)URL变量注入象 ?变种= foo的& & VAR2 =酒吧 也让转换(如果有的身体确实是)转移该页面 ?重定向= foo和负载炫魅,并将该重定向值输入框

2)基于服务器的验证,但里面的股利和必须显示加载GIF和DONOT重新加载整个页面..

东西,我看了,但失败...

1)JCryption但它需要jQuery的比我要重新编码的一切......

2)

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

此命令失败,IE7浏览器。 (这是唯一的最佳方法,但不能在一个浏览器中失败)还有一个问题是,如果某个创建者在本地主机上运行它,则将该动作更改为http://myurl,而不会接受它。另外,如果我们使用curl来发送自定义标题,那么它将会失败。

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

也使用其他几种方法,但我认为所有上述方法是最好的描述我的问题... 请明白,解决方案可能是非常小或大,但我不明白JavaScript非常亲切地阐述。

回答

0

您需要一个nonce

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

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

    <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'); 
    
  • 如果检测到错误,则更新程序失败并且不做任何更改。

+0

或将其作为参数添加到AJAX URL? – Altainta 2011-02-01 17:09:42