最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Using XMLHTTPRequest to extract data from Database - Stack Overflow

programmeradmin8浏览0评论

I want to extract some data from the database without refreshing a page. What is the best possible way to do this?

I am using the following XMLHTTPRequest function to get some data (shopping cart items) from cart.php file. This file performs various functions based on the option value. For example: option=1 means get all the shopping cart items. option=2 means delete all shopping cart items and return string "Your shopping cart is empty.". option=3, 4...and so on.

My XHR function:

    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 file looks like:

    $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
    }

My Questions:

  1. Is there any other way I can get the data from database without refreshing the page?
  2. Are there any potential threats (hacking, server utilization, performance etc) in my way of doing this thing? I believe a hacker can flood my server be sending unnecessary requests using option=1, 2, 3 etc.

I want to extract some data from the database without refreshing a page. What is the best possible way to do this?

I am using the following XMLHTTPRequest function to get some data (shopping cart items) from cart.php file. This file performs various functions based on the option value. For example: option=1 means get all the shopping cart items. option=2 means delete all shopping cart items and return string "Your shopping cart is empty.". option=3, 4...and so on.

My XHR function:

    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 file looks like:

    $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
    }

My Questions:

  1. Is there any other way I can get the data from database without refreshing the page?
  2. Are there any potential threats (hacking, server utilization, performance etc) in my way of doing this thing? I believe a hacker can flood my server be sending unnecessary requests using option=1, 2, 3 etc.
Share Improve this question edited Aug 30, 2014 at 20:35 AstroCB 12.4k20 gold badges59 silver badges74 bronze badges asked Dec 28, 2011 at 13:20 sumitsumit 11.3k24 gold badges67 silver badges84 bronze badges 0
Add a ment  | 

4 Answers 4

Reset to default 2

I don't think a Denial of Service attack would be your main concern, here. That concern would be just as valid is cart.php were to return HTML. No, exposing a public API for use via AJAX is pretty mon practice.

One thing to keep in mind, though, is the ambiguity of both listing and deleting items via the same URL. It would be a good idea to (at the very least) separate those actions (or "methods") into distinct URLs (for example: /cart/list and /cart/clear).

If you're willing to go a step further, you should consider implementing a "RESTful" API. This would mean, among other things, that methods can only be called using the correct HTTP verb. You've possibly only heard of GET and POST, but there's also PUT and DELETE, amongst others. The reason behind this is to make the methods idempotent, meaning that they do the same thing again and again, no matter how many times you call them. For example, a GET call to /cart will always list the contents and a DELETE call to /cart will always delete all items in the cart.

Although it is probably not practical to write a full REST API for your shopping cart, I'm sure some of the principles may help you build a more robust system.

Some reading material: A Brief Introduction to REST.

Ajax is the best option for the purpose.

Now sending and receiving data with Ajax is done best using XML. So use of Web services is the remended option from me. You can use a SOAP / REST web service to bring data from a database on request.

You can use this Link to understand more on Webservices.

For the tutorials enough articles are available in the Internet.

  1. you're using a XMLHttpRequest object, so you don't refresh your page (it's AJAX), or there's something you haven't tell

  2. if a hacker want to DDOS your website, or your database, he can use any of its page... As long as you don't transfer string between client and server that will be used in your SQL requests, that should be OK

  3. I'd warn you about the use of raw text response display. I encourage you to format your response as XML or JSON to correctly locate objects that needs to be inserted into the DOM, and to return an tag to correctly handle errors (the die("i'm your father luke") won't help any of your user) and to display them in a special area of your web page

First, you should consider separating different parts of your application. Having a general file that performs every other tasks related to carts, violates all sorts of software design principles.

Second, the first vulnerability is SQL injection. You should NEVER just concatenate the input to your SQL.

Suppose I posted 1; TRUNCATE TABLE cart;. Then your SQL would look like:

select itemid from cart where cartid=1; TRUNCATE TABLE cart; which first selects the item in question, then ruins your database.

You should write something like this:

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

To avoid refreshing, you can put a link on your page. Something like, <a href="javascript:void(0);" onclick="getAllCartItems();">Refresh</a>

In terms of security, it will always pay to introduce a database layer concerned with just your data, regardless of your business logic, then adding a service layer dependent on the database layer, which would provide facilities to perform business layer actions.

You should also take @PPvG remendation into note, and -- using Apache's mod_rewrite or other similar facilities -- make your URLs more meaningful.

Another note: try to encapsulate your data in JSON or XML format. I'd remend the use of json_encode(); on the server side, and JSON.parse(); on the client side. This would ensure a secure delivery.

发布评论

评论列表(0)

  1. 暂无评论