【问题标题】:Using XMLHTTPRequest to extract data from Database使用 XMLHTTPRequest 从数据库中提取数据
【发布时间】:2012-01-29 04:44:07
【问题描述】:

我想在不刷新页面的情况下从数据库中提取一些数据。最好的方法是什么?

我正在使用以下 XMLHTTPRequest 函数从 cart.php 文件中获取一些数据(购物车项目)。该文件根据option 值执行各种功能。 例如:option=1 表示获取所有购物车商品。 option=2 表示删除所有购物车项目并返回字符串"Your shopping cart is empty."。 option=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等

【问题讨论】:

    标签: javascript php mysql xmlhttprequest


    【解决方案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);
    

    为避免刷新,您可以在页面上放置一个链接。比如&lt;a href="javascript:void(0);" onclick="getAllCartItems();"&gt;Refresh&lt;/a&gt;

    在安全性方面,无论您的业务逻辑如何,引入一个只与您的数据相关的数据库层总是值得的,然后添加一个依赖于数据库层的服务层,这将提供执行业务层操作的设施。

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

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

    【讨论】:

      【解决方案2】:

      我认为 拒绝服务 攻击不是您主要关心的问题,这里。这种担忧与cart.php 将返回 HTML 一样有效。不,通过 AJAX 公开一个公共 API 以供使用是很常见的做法。

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

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

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

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

      【讨论】:

      • 你能否澄清一下 RESTful api 如何减少我对拒绝服务攻击的脆弱性,而不是使用 HTTP POST 或 GET?我问的原因是我已经实现了与 GET 或 POST 一起使用的 API,我一直想知道如何使它们更安全。谢谢!
      • @Manish:他们没有,而你确实使用POSTGET。 REST 旨在使您的 API 不那么模糊(更明确)并防止意外的副作用。如何保护您的 API 取决于您想要保护它反对的内容(即您想要访问限制还是防止泛滥?)
      • 我使用 HSA1 实现了访问限制。我想知道洪水。我读了一篇有趣的论文,它提供了(希望我加了书签)数据,表明即使是帖子也更容易被获取。
      【解决方案3】:
      1. 您正在使用 XMLHttpRequest 对象,因此您不会刷新页面(它是 AJAX),或者有些事情您没有告诉

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

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

      【讨论】:

        【解决方案4】:

        Ajax 是达到此目的的最佳选择。

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

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

        对于教程,互联网上有足够多的文章。

        【讨论】:

        • “AJAX最好使用XML”就像说“最好通过amphibian去任何地方”。当然,XML 有它的用途。但有时更简单的交换格式,如JSON,是更好的选择。这一切都取决于上下文。
        • 换句话说:如果你要去隔壁(10m:你应该步行)或去地球的另一边(16.000km:买机票),不要开车。
        • 另外,需要注意的是,对于慢速连接,XML 占用大量带宽,而 JSON 则轻得多。
        猜你喜欢
        • 1970-01-01
        • 2015-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-01
        相关资源
        最近更新 更多