Использование XMLHTTPRequest для извлечения данных из базы данных - PullRequest
2 голосов
/ 28 декабря 2011

Я хочу извлечь некоторые данные из базы данных, не обновляя страницу.Каков наилучший способ сделать это?

Я использую следующую функцию 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. Существуют ли потенциальные угрозы (взлом, использование сервера, производительность и т. д.) по-моему?Я полагаю, что хакер может затопить мой сервер, отправляя ненужные запросы, используя параметр = 1, 2, 3 и т. Д.

Ответы [ 4 ]

2 голосов
/ 28 декабря 2011

Я не думаю, что атака Отказ в обслуживании будет вашей главной проблемой здесь. Эта проблема была бы такой же действительной, как если бы cart.php вернул HTML. Нет, использование публичного API для использования через AJAX является довольно распространенной практикой.

Однако следует помнить одну вещь: неоднозначность перечисления и удаления элементов по одному и тому же URL. Было бы неплохо (как минимум) разделить эти действия (или «методы») на отдельные URL-адреса (например: /cart/list и /cart/clear).

Если вы хотите пойти дальше, вам следует подумать о реализации API RESTful . Это будет означать, среди прочего, что методы могут быть вызваны только с использованием правильного HTTP-глагола. Возможно, вы слышали только о GET и POST, но среди прочих есть и PUT и DELETE. Причина этого в том, чтобы сделать методы идемпотентными , что означает, что они делают одно и то же снова и снова, независимо от того, сколько раз вы их вызываете. Например, GET вызов /cart всегда перечисляет содержимое, а DELETE вызов /cart всегда удаляет все элементы в корзине.

Хотя, вероятно, нецелесообразно писать полный REST API для вашей корзины покупок, я уверен, что некоторые принципы могут помочь вам построить более надежную систему.

Некоторые материалы для чтения: Краткое введение в ОТДЫХ .

1 голос
/ 28 декабря 2011

Во-первых, вы должны рассмотреть возможность разделения различных частей вашего приложения.Наличие общего файла, который выполняет все остальные задачи, связанные с тележками, нарушает все виды принципов разработки программного обеспечения.

Во-вторых, первой уязвимостью является внедрение 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(); на стороне клиента.Это обеспечит безопасную доставку.

1 голос
/ 28 декабря 2011
  1. вы используете XMLHttpRequest объект, поэтому вы не обновляете свою страницу (это AJAX) или есть что-то, чего вы не сказали

  2. если хакер захочет DDOS вашего сайта или вашей базы данных, он может использовать любую его страницу ... Пока вы не передадите строку между клиентом и сервером, которая будет использоваться в ваших запросах SQL должно быть в порядке

  3. Я бы предупредил вас об использовании отображения необработанного текста. Я рекомендую вам отформатировать ваш ответ как XML или JSON, чтобы правильно найти объекты, которые необходимо вставить в DOM, и вернуть тег для правильной обработки ошибок (die («Я твой отец Люк») не поможет любого вашего пользователя) и отображать их в специальной области вашей веб-страницы

1 голос
/ 28 декабря 2011

Ajax - лучший вариант для этой цели.

Теперь отправка и получение данных с помощью Ajax лучше всего выполняется с использованием XML.Поэтому использование Web services является рекомендуемым вариантом от меня.Вы можете использовать веб-сервис SOAP / REST для получения данных из базы данных по запросу.

Вы можете использовать эту ссылку , чтобы понять больше о веб-сервисах.в интернете достаточно статей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...