Специальные символы в php - javascript - ajax - PullRequest
0 голосов
/ 04 января 2019

У меня есть простой скрипт комментария, который позволяет добавлять / редактировать / удалять комментарии. У меня проблема со спецсимволами.

Если var currentMessage содержит 'или ", то код прерывается.

Я сохраняю комментарии в БД следующим образом:

$ Message = clean_data ($ _ POST ["txtmessage"]); Затем выполните типичное сохранение mysqli_query ....

function clean_data($input) {
    $input = trim(htmlentities(strip_tags($input,",")));
    if (get_magic_quotes_gpc())
    $input = stripslashes($input);
    $input = stripslashes($input);
    $input = htmlspecialchars($input, ENT_IGNORE, 'utf-8');
    $input = trim($input);
    $sqllink = new mysqli(MySQL_Host, MySQL_UserName, MySQL_Password, MySQL_Database);
    $input = mysqli_real_escape_string($sqllink, $input);
    no_magic_quotes($input);
$input = str_replace("'", "'", $input);
    $input = str_replace("&", "&", $input);
    $input = str_replace('"', """, $input);
    $input = strip_tags($input);
    return $input;
}

Данные, сохраненные в MySQL, выглядят следующим образом: let's do it !

Моя кнопка редактирования выглядит так:

<button id="BtnEdit_<?php echo $r_c['CommentID']; ?>" class="btn btn-xs btn-warning" onClick="showEditBox(this,<?php echo $r_c['CommentID']; ?>)" name="edit"><i class="fas fa-edit"></i> <? echo _("To Edit"); ?></button>

Мое сообщение отображается так:

<div class="message-content"><? echo $r_c['Message']; ?></div>

Если я показываю специальные символы в php echo, тогда javascript не работает. Если я уберу все "или" ", тогда все в порядке. Но это не практично.

function showEditBox(editobj,id) {
    $('#BtnEdit_'+ id).hide();
    $('#frmAdd').show();

    var currentMessage = $("#message_" + id + " .message-content").html();
    var editMarkUp = '<input type="text" class="form-control input-sm" name="txtmessage" id="txtmessage_'+id+'" value="'+currentMessage+'"><br><div class="btn-group pull-left"><button class="btn btn-xs btn-success" name="ok" onClick="callCrudAction(\'edit\','+id+')"><i class="fas fa-check"></i> <? echo _("Save"); ?></button>&nbsp;&nbsp;&nbsp;&nbsp;<button class="btn btn-xs btn-default" name="cancel" onClick="cancelEdit(\''+currentMessage+'\','+id+')"><i class="fas fa-times"></i> <? echo _("Cancel"); ?></button></div>';
    $("#message_" + id + " .message-content").html(editMarkUp);
}

Данные отображаются следующим образом: давайте сделаем это! (было бы лучше, если бы это было - давайте сделаем это!)

Кнопка редактирования даже не работает, если в комментарии есть '.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Вам не понадобится вся эта уборка с вызовами на htmlentities, strip_tags, stripslashes, htmlspecialchars, mysqli_real_escape_string или no_magic_quotes. Хотя вы не включили код, в который вы вставляете данные, это показывает, что вы не вставляете их с подготовленным оператором. И это именно то, что вы должны пойти.

Это может выглядеть так:

Запись в БД на PHP:

$message = $_POST["txtmessage"]; 
$sqllink = new mysqli(MySQL_Host, MySQL_UserName, MySQL_Password, MySQL_Database);
$stmt = $sqllink->prepare("INSERT INTO messages(message) VALUES(?)");
$stmt->bind_param("s", $message);
$stmt->execute();
$stmt->close();

Генерация HTML должна обеспечивать использование HTML-объектов, где это необходимо, особенно для амперсанда. Так что звоните htmlspecialchars здесь:

<div class="message-content"><? echo htmlspecialchars($r_c['Message']); ?></div>

Обработчик нажатия кнопки JavaScript не должен извлекать html из сообщения, а text. Кроме того, не устанавливайте value из input в фрагменте HTML; вместо этого присвойте значение с помощью val():

function showEditBox(editobj, id) {
    $('#BtnEdit_'+ id).hide();
    $('#frmAdd').show();

    // Use text():
    var currentMessage = $("#message_" + id + " .message-content").text();
    // Instead of building HTML with string concatenation, build nodes with jQuery.
    // That way you don't have the problem of escaping/encoding
    var nodes = [
        $("<input>").addClass("form-control input-sm").attr({
            type: "text", name: "txtmessage", id: "txtmessage_"+id
        }).val(currentMessage), // <-- here is where the value is set
        $("<br>"),
        $("<div>").addClass("btn-group pull-left").append(
            $("<button>").addClass("btn btn-xs btn-success").attr({ name: "ok" }).append(
                $("<i>").addClass("fas fa-check"),
                "<? echo _("Save"); ?>"
            ).click(callCrudAction.bind(null, 'edit', id))
        ),
        "\xA0\xA0\xA0\xA0", // non-breaking spaces
        $("<button>").addClass("btn btn-xs btn-default").attr({ name: "cancel" }).append(
            $("<i>").addClass("fas fa-times"),
            "<? echo _("Cancel"); ?>"
        ).click(cancelEdit.bind(null, currentMessage, id))
    ];
    $("#message_" + id + " .message-content").empty().append(nodes);
}

Я не изменил HTML, но вместо создания неразрывных пробелов вы должны добавить поле для кнопок с помощью CSS.

0 голосов
/ 04 января 2019

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

// Validate that the data is the type/size you expect, but don't modify it
$message = basicValidation($_POST["txtmessage"]);

$stmt = $mysqli->prepare('INSERT INTO foo VALUES (?)')
$stmt->bind_param("s", $message);
$stmt->execute();

Это защищает вас от внедрения SQL-кода и гарантирует, что ваши данные вставляются точно , как указано, без необходимости делать какую-либо искажающую чепуху с HTML-сущностями, полосками или другими вещами, которые должны применяться только к выход . * +1010 *

Получение данных для display - это когда вы должны применять преобразования, чтобы было безопасно включать их в HTML или любой другой формат , который вы можете использовать. Вы бы не хотели вставлять кучу бессмысленных HTML-сущностей в документ PDF, не так ли?

$message = mysqli_nonsense();
?><div>
<p><?= htmlentities($message) ?></p>
</div>

Это защищает вас от внедрения JavaScript.

Намного проще, не правда ли?

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