使用XMLHTTPRequest从数据库中提取数据

时间:2011-12-28 13:20:10

标签: javascript php mysql 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. 是否存在任何潜在威胁(黑客攻击,服务器利用率, 在我这样做的方式吗?我相信一个黑客 我的服务器可以使用option = 1发送不必要的请求 2,3等。

4 个答案:

答案 0 :(得分:2)

我不认为拒绝服务攻击是您的主要关注点。这种担忧与cart.php返回HTML一样有效。不,通过AJAX公开公共API是非常常见的做法。

但要记住的一件事是,通过相同的URL列出和删除项目的模糊性。最好(至少)将这些操作(或“方法”)分成不同的URL(例如:/cart/list/cart/clear)。

如果您愿意更进一步,则应考虑实施“RESTful”API。除其他外,这意味着只能使用正确的HTTP谓词调用方法。您可能只听说过GETPOST,但还有PUTDELETE等。这背后的原因是使方法幂等,这意味着无论你多少次调用它们,它们会一次又一次地做同样的事情。例如,对GET的{​​{1}}来电将始终列出内容,/cartDELETE的来电将始终删除购物车中的所有商品。

尽管为您的购物车编写完整的REST API可能不切实际,但我确信其中一些原则可能有助于您构建更强大的系统。

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

答案 1 :(得分:1)

Ajax是此目的的最佳选择。

使用Ajax,最好使用XML发送和接收数据。因此,我建议使用Web services。您可以使用SOAP / REST Web服务根据请求从数据库中提取数据。

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

对于教程,可以在Internet上找到足够的文章。

答案 2 :(得分:1)

  1. 您正在使用XMLHttpRequest对象,因此您不刷新页面(它是AJAX),或者您还没有告诉

  2. 如果黑客想要DDOS您的网站或您的数据库,他可以使用它的任何页面...只要您不在客户端和服务器之间传输将在您的SQL请求中使用的字符串,那应该没问题

  3. 我警告你使用原始文本响应显示。我鼓励您将响应格式化为XML或JSON,以正确定位需要插入DOM的对象,并返回标记以正确处理错误(die(“我是你父亲的luke”)将无济于事您的任何用户)并将其显示在您网页的特殊区域

答案 3 :(得分: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或其他类似工具 - 使您的网址更有意义。

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