2011-12-28 43 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();。這將確保交付安全。