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

Я пытаюсь сделать живой поиск с 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 х 50

Но тогда это выходит на странице, выглядящей точно так же.

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

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

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

3 ответа

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам