Живой поиск с использованием Jquery, PHP и MySQL порождает определенные результаты, как избежать этого? - PullRequest
1 голос
/ 29 апреля 2011

Я пытаюсь сделать живой поиск с JQuery, PHP и MySQL.Я не эксперт, но знаю и понимаю достаточно, чтобы быть опасным.В любом случае, кажется, что все работает, за исключением случаев, когда любой из моих результатов поиска содержит одинарные или двойные кавычки.Например, мои результаты поиска могут содержать:

Контакт, дверь 3/4 "утопленаДетектор движения 35 'x 50'

И т. Д. И т. П.

Мой код:

<script type="text/javascript">
function lookup(inputString) {
    if(inputString.length == 0) {
        // Hide the suggestion box.
        $('#suggestions').hide();
    } else {
        $.post("get_parts.php", {queryString: ""+inputString+""}, function(data){
            if(data.length >0) {
                $('#suggestions').show();
                $('#autoSuggestionsList').html(data);
            }
        });
    }
}   
function fill(thisValue) {
    $("#inputString").val(thisValue);
    setTimeout("$('#suggestions').hide();", 200);
}
</script>

и

<?php
if(isset($_POST['queryString'])) {
    $queryString = $_POST['queryString'];  
    if(strlen($queryString) >0) {
        $query = "SELECT short_desc
                  FROM equipment
                  WHERE short_desc
                  LIKE '$queryString%'
                  ORDER BY short_desc
                  ASC LIMIT 10";
        $result = mysql_query($query) or die("There is an error in database");
        while($row = mysql_fetch_array($result)){
            $escaped_desc_html = htmlentities($row['short_desc']);
            $escaped_desc_escape = addslashes($row['short_desc']);
            echo
            "<li onClick=\"fill('".$escaped_desc_html."');\">".$escaped_desc_html."</li>";
        };
    };
};
?>

Я пытался сохранить данные в MYSQL следующим образом:

Контакт, дверь 3/4 \ "утопленДетектор движения 35 \ 'x 50 \'

Но потом он появляется на странице, выглядя так же.

Я пробовал addlashes (), htmlentities (), комбинации обоихи это продолжает ломаться.Я пробовал escape () в javascript, но тогда я не получаю никакого форматирования, и список представляет собой непрерывный блок перемешанного текста.

Моя проблема в том, что результаты моего поиска передаются обратно в Jquery,эта кавычка или двойные кавычки заставляет думать, что команда закончена, и я получаю ошибку об отсутствии).Есть ли способ заставить Jquery игнорировать любые html, косые черты или кавычки, которые возвращаются как данные?Может быть, он рассматривает это как объект вместо команд.Даже с htmlentities () the & quo;все еще нарушает код.Это сводит меня с ума!Проблема всегда ломается в этих двух местах:

$('#autoSuggestionsList').html(data);а также$("#inputString").val(thisValue);

Ответы [ 3 ]

1 голос
/ 10 августа 2012

У меня была похожая проблема.Поскольку моя проблема была только с двойными кавычками, я преобразовал их в &quot; при вводе, используя:

$OUTPUT = str_replace("\"","&quot;",$INPUT);

Если это вызывает проблемы для вас, JavaScript, вы можете использовать тот же код для замены&quot; с "-" или чем-то еще.

Когда вы доберетесь до стадии ввода пользователя, обязательно защитите себя от атак инъекций, как уже упоминали другие!

Извинитетолько что видел дату на этом !!надеюсь, это поможет кому-то, хотя

0 голосов
/ 29 апреля 2011

Вы оставляете себе WIDE OPEN для атак с использованием SQL-инъекций с помощью приведенного выше кода.Вам необходимо вызвать mysql_real_escape_string () для значения перед выполнением оператора SQL.

0 голосов
/ 29 апреля 2011

Вы должны использовать mysql_real_escape_string для экранирования переменной в запросах MySQL. Что еще более важно, вы должны быть очень осторожны, чтобы правильно избегать как содержимого, которое вы помещаете в базу данных, так и содержимого, которое вы отображаете для пользователя ... вы никогда не должны доверять вводу, предоставленному пользователем, потому что если вы это сделаете, наткнуться хотя бы на одного злоумышленника, который эксплуатирует такую ​​уязвимость.

Лучший способ избежать этого:

  1. Модульное тестирование каждого компонента и выполнение проверки в модульных тестах (убедитесь, что на каждом компоненте имеется соответствующий код проверки / экранирования и что он действительно работает).

  2. Используйте фаззеры для автоматического создания входных данных, чтобы попытаться найти эти проблемы. Например, может ли пользователь сгенерировать вход, чтобы он мог удалить всю вашу базу данных?

...