2011-12-28 42 views
2

我想在不刷新页面的情况下从数据库中提取一些数据。什么是最好的方式来做到这一点?使用XMLHTTPRequest从数据库中提取数据

我正在使用以下XMLHTTPRequest函数从cart.php文件中获取一些数据(购物车项目)。该文件基于option值执行各种功能。 例如:option=1表示获得所有的购物车物品。 option=2表示删除所有购物车物品并返回字符串"Your shopping cart is empty."。选项= 3,4 ...等等。

我XHR功能:

function getAllCartItems() 
    { 
     if(window.XMLHttpRequest) 
     { 
      allCartItems = new XMLHttpRequest(); 
     } 
     else 
     { 
      allCartItems=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 

     allCartItems.onreadystatechange=function() 
     { 
      if (allCartItems.readyState==4 && allCartItems.status==200) 
      { 
       document.getElementById("cartmain").innerHTML=allCartItems.responseText; 
      } 
      else if(allCartItems.readyState < 4) 
      { 
       //do nothing 
      } 
     } 
     var linktoexecute = "cart.php?option=1"; 
     allCartItems.open("GET",linktoexecute,true); 
     allCartItems.send(); 
    } 

cart.php文件看起来像:

$link = mysql_connect('localhost', 'user', '123456'); 
    if (!$link) 
    { 
     die('Could not connect: ' . mysql_error()); 
    } 
    mysql_select_db('projectdatabase'); 
    if($option == 1) //get all cart items 
    { 
     $sql = "select itemid from cart where cartid=".$_COOKIE['cart'].";"; 
     $result = mysql_query($sql); 
     $num = mysql_num_rows($result); 
      while($row = mysql_fetch_array($result)) 
      { 
       echo $row['itemid']; 
      } 
    } 
    else if($option == 2) 
    { 
      //do something 
    } 
    else if($option == 3) 
    { 
      //do something 
    } 
    else if($option == 4) 
    { 
      //do something 
    } 

我的问题:

  1. 是否有其他方法可以让我得到来自数据库的数据没有 刷新页面?
  2. 是否有任何潜在的威胁(黑客攻击,服务器利用率, 表现等)在我做这件事的方式吗?我相信黑客可以 淹没我的服务器使用选项= 1, 2,3等

回答

2

我不认为是一个拒绝服务攻击将是您的主要关注,在这里。这种担心与cart.php返回HTML一样有效。不,公开的API通过AJAX使用是非常普遍的做法。

但是,有一点需要记住的是,通过相同的URL列出和删除项目都是不明确的。 (至少)将这些操作(或“方法”)分隔为不同的URL是一个好主意(例如:/cart/list/cart/clear)。

如果您愿意更进一步,您应该考虑实施“RESTful”API。这意味着,除其他外,只能使用正确的HTTP动词调用方法。您可能只听说过GETPOST,但其中还有PUTDELETE。这背后的原因是使方法幂等性,这意味着他们一次又一次地做同样的事情,无论多少次你称他们。例如,致电/cartGET将始终列出内容,DELETE致电/cart将始终删除购物车中的所有项目。

尽管为您的购物车编写完整的REST API可能不太实际,但我相信一些原则可能会帮助您构建更强大的系统。

一些阅读材料:A Brief Introduction to REST

+0

您能否澄清RESTful api如何减少拒绝服务攻击的漏洞,而不是使用HTTP POST或GET?我想问的原因是我已经实现了使用GET或POST的API,我一直在想如何让它们更安全。谢谢! – 2011-12-28 13:40:57

+0

@Manish:他们不知道,你*使用'POST'和'GET'。 REST旨在使您的API不那么模糊(更明确),并防止意想不到的副作用。如何保护您的API取决于您希望保护它*针对*(例如,您想限制访问还是防止泛滥?) – PPvG 2011-12-28 13:47:05

+0

我有使用HSA1实施的访问限制。我想知道洪水。我阅读了一篇有趣的文章,其中提出了(希望我已添加书签)数据,以表明即使是后期更容易获得。 – 2011-12-28 14:12:40

1

Ajax是为目的的最佳选择地发送不必要的请求。

现在用Ajax发送和接收数据最好使用XML。所以使用Web services是我推荐的选项。您可以使用SOAP/REST Web服务根据请求从数据库中提取数据。

您可以使用此Link了解有关Webservices的更多信息。

对于教程来说,足够的文章可以在互联网上找到。

+0

说*“AJAX最好用XML来完成”*就像说*“最好随时随地通过[amphibian](http://en.wikipedia.org/wiki/Amphibious_vehicle)”*。当然,XML有其用途。但有时更简单的交换格式,如[JSON](http://www.json.org/)是更好的选择。这一切都取决于上下文。 – PPvG 2011-12-28 13:39:22

+0

换句话说:如果你要去隔壁(10米:你应该走路)或到地球的另一边(16.000公里:买机票),不要开车去。 – PPvG 2011-12-28 13:53:08

+0

另外,应该注意的是,对于慢速连接,XML使用大量带宽,而JSON要轻得多。 – 2011-12-28 14:05:31

1
  1. 您使用的是XMLHttpRequest对象,所以你不要刷新页面(这是AJAX),或有东西,如果黑客想DDOS你的网站,你还没有告诉

  2. ,或者你的数据库,他可以使用它的任何页面...只要你不在客户端和服务器之间传输将用于你的SQL请求的字符串,那应该是好的

  3. 我会提醒你关于使用原始文本响应显示。我鼓励您将响应格式设置为XML或JSON,以正确定位需要插入到DOM中的对象,并返回标签以正确处理错误(“我是你的父亲luke”)不会帮助你任何用户),并在网页中的特殊区域

1

首先显示它们,你应该考虑将你的应用程序的不同部分。执行与购物车有关的所有其他任务的通用文件违反了各种软件设计原则。

二,第一个漏洞是SQL注入。你应该从不只是连接你的SQL输入。

假设我发布了1; TRUNCATE TABLE cart;。然后你的SQL看起来像:

select itemid from cart where cartid=1; TRUNCATE TABLE cart;它首先选择有问题的项目,然后毁掉你的数据库。

你应该写这样的事:

$item = $_COOKIE['cart']; 
$item = preg_replace_all("['\"]", "\\$1", $item); 

为了避免刷新,你可以把你的页面上的链接。例如,<a href="javascript:void(0);" onclick="getAllCartItems();">Refresh</a>

在安全性方面,无论您的业务逻辑如何,都会引入与数据相关的数据库层,然后添加依赖于数据库层的服务层,这将为设备执行业务层操作。

您还应该注意@PPvG建议,并且 - 使用Apache的mod_rewrite或其他类似工具 - 使您的URL更具意义。

另一个注意事项:尝试用JSON或XML格式封装数据。我建议在服务器端使用json_encode();,在客户端使用JSON.parse();。这将确保交付安全。