Почему я должен кодировать строку при чтении и вводе форм с использованием jquery?

Я программно читаю данные из текстового ввода, используя стандартный Jquery, как это:

  var listName = $('#list').val();

а затем я добавляю скрытое поле ввода в форму перед отправкой следующим образом:

var myForm = $("#myForm);
myForm.append('<input type="hidden" name="List" value="' + listName + '" />');

В одном примере значение в поле:

Key Date & Times

поэтому в пользовательском интерфейсе это выглядит как

<input type="hidden" name="MyList" value="Key Date & Times" />

когда я отправлю форму, используя:

var myForm = $("#myForm);
myForm.submit();

и проверьте его на стороне сервера asp.net-mvc, я вижу только:

Key Date 

. После некоторого исследования было предложено написать некоторый javascript для запуска значения через:

encodeURIComponent()

После этого и взгляда на серверную сторону теперь я вижу:

Key%20Date%20%26%20Times

Как я могу преобразовать это обратно в

Key Date & Times

на стороне сервера С# asp.net-mvc? Или отдельно, если я делаю что-то не так на стороне клиента, пожалуйста, позвольте мне, если у вас есть какие-либо предложения.

Мой главный вопрос: почему мне приходится беспокоиться о кодировании значения скрытого поля ввода в форме. Я бы подумал, что за вас позаботятся.

Ответы

Ответ 1

string decodeString = HttpUtility.UrlDecode(@"Key%20Date%20%26%20Times");

Использовать метод UrlDecode класса HttpUtility.

Ответ 2

Я думаю, что не нужно ничего делать с вашим кодом, он работает правильно, у меня есть ниже кода, пожалуйста, подтвердите его.

Просмотр /HTML:

@using (@Html.BeginForm("Save", "Home", FormMethod.Post, new { id = "myForm", name = "myForm" }))
{
    <input type="button" class="btn btn-danger" value="Click" id="btnClick">
}

Jquery:

$(document).ready(function () {
    var myForm = $("#myForm");
    myForm.append('<input type="hidden" name="List" value="Key Date & Times" />');

    $('#btnClick').click(function () {
        var myForm = $("#myForm");
        myForm.submit();

    });
});

Контроллер:

public ActionResult Save()
{
      return RedirectToAction("Index");
}

Вывод:

введите описание изображения здесь

Ответ 3

Там что-то не так на стороне клиента. Я протестировал следующий код, который похож на тот, который вы написали, и работал отлично!

<input type="hidden" id="ref" value="Key Date & Times" />
<form id="form1" action="~/home/handle" method="post">
    <input type="submit" />
</form>

<script>
    var myForm = $('#form1');
    var listName = $('#ref').val();
    myForm.append('<input type="hidden" name="name" value="' + listName + '" />');
</script>

Вам не нужно использовать инструменты преобразования!

Ответ 4

это происходит, когда вы используете метод GET для отправки формы (в методе GET '&' действует как разделитель переменных) вы должны использовать метод POST или манипуляцию строками.

если вы используете encodeURIComponent(), вы можете преобразовать его с помощью Server.UrlDecode(""); на стороне сервера

вы также можете прочитать это для дополнительных знаний Нажмите здесь

Ответ 5

Вероятно, вы отправляете запрос GET на сервер, и поэтому все значения полей каждой формы ввода отправляются на сервер в строке запроса.

Таким образом, как уже сказано Zulqarnain Jalil, каждый '&' он интерпретируется сервером как разделитель пар ключ/значение в строке запроса, и поэтому вы пропускаете последнюю часть поля скрытой формы ввода "Список".

Следовательно, в этом случае вы должны закодировать все ваши значения с помощью "&" char.

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

Если вы хотите избежать URL-кодирования, попробуйте преобразовать свой запрос в запрос POST:

var myForm = $("#myForm");
myForm.method = "post";
myForm.submit();

Ответ 6

Вы также можете использовать. Существует опечатка в var myForm = $("#myForm");

string decodeString = Server.UrlDecode("Key%20Date%20%26%20Times");

ИЛИ

string decodeString = Uri.UnescapeDataString("Key%20Date%20%26%20Times");

Ответ 7

Многое связано с реализацией защиты от атак типа Cross Site Scripting (XSS). Вам нужно закодировать все поля ввода html, которые будут использоваться в почтовом запросе. В противном случае кто-то может добавить domaliciousStuff() в текстовое поле и будет храниться в базе данных. Затем, когда данные снова будут отображаться в форме, ваш script (теперь сохраненный в базе данных, будет запущен на веб-странице!).

AntiXSS - отличная библиотека, которая обладает больше возможностей, чем встроенный Html.Encode. Вы можете найти его через Nuget Package Manager.

https://www.nuget.org/packages/AntiXSS/

Ответ 8

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

Когда данные содержат пробелы и специальные символы, такие как (&) в вашем случае, разработчик приложения должен закодировать его так, чтобы данные были безопасны для обработки сервером. Наличие пробелов и специальных символов создает проблемы безопасности, такие как XSS. Это всего лишь один из многих шагов, которые должен предпринять ответственный разработчик для смягчения таких угроз безопасности.

Относительно того, как вернуть значения на стороне сервера, используйте следующий класс в пространстве имен System.Web

string values = "Key%20Date%20%26%20Times";
string decodeString = HttpUtility.UrlDecode(values);

Надеюсь, он ответит на ваш вопрос (ы)

Ответ 9

Вы можете просто добавить accept-charset = "ISO-8859-1" в тег формы и не беспокоиться о кодировке, которая автоматически преобразует специальные символы.

<!DOCTYPE html>
<html>
<body>

<form action="demo_form.asp" accept-charset="ISO-8859-1">
  First name: <input type="text" name="fname"><br>
  Last name: <input type="text" name="lname"><br>
  <input type="submit" value="Submit">
</form>

</body>
</html>

Вы можете протестировать его здесь

Ответ 10

вам придется декодировать его на стороне сервера... вы можете поместить текст "Ключевая дата и время" в поле здесь, и вы можете увидеть, что результат, поступающий с сервера, содержит% 26 вместо &...

Ответ 11

У меня была такая же проблема с 3 до 4 дней назад. Я работал с Angular и ASP. Как и ответы выше, я тоже должен был использовать URLDecode.

Отвечая на ваш вопрос: Зачем мне кодировать ввод пользователя?


Избегать неожиданного поведения

Скажите, что ваше приложение может обрабатывать два параметра в запросе GET.

Это относится только к одному аргументу
localhost:5000/stalls?searchbook=

Это принимает два аргумента
localhost:5000/stalls?searchbook=&includesecret=

У вас также есть страница, которая может искать книги.
Независимо от того, что пользователь вводит в панель поиска, появляется запрос GET.
 localhost:5000/stalls?searchbook=USERSTRINGGOESHERE

Если пользователь должен был искать &includesecret=true
Результирующий запрос GET localhost:5000/stalls?searchbook=&includesecret=true и может случайно привести к утечке конфиденциальных данных пользователю на странице результатов.

Символы, которые обычно кодируются (пробелы, &,% и т.д.), могут много раз означать разные вещи. '& Амп;' разделяет ключи в запросе GET и может также быть частью строки, поэтому использование без кодирования может привести к ожидаемому поведению.

P.S: - Личные данные не должны запрашиваться с помощью запроса GET. Это просто для этого примера:)


Согласованность

При тестировании моего приложения я заметил, что по умолчанию кодированные строки PhantomJS. Таким образом, у меня разные результаты поиска у разных клиентов. Поэтому можно с уверенностью предположить, что некоторые клиенты могут кодировать URL-адрес, даже если вы этого не сделаете.


Другой пример

Клавиши

'#' могут быть частью URL-адреса. Если я нахожусь в localhost:5000/homepage.html#footer, элемент с нижним колонтитулом ID появляется. Это также может привести к поведению, которого вы не ожидаете. Попробуйте ввести # в параметры запроса GET, которые не закодированы и не очищены от несимвольных символов, и вы, скорее всего, окажетесь в ситуации, подобной моей. Функция поиска, которую я написал несколько дней назад, сломалась бы, если бы я ввел # в нее (когда она не была закодирована).

Ответ 12

Вы можете заменить все пробелы %20.

string values = "Key%20Date%20%26%20Times"; string decodeString = values.replace(/%20/g,' ');

Ответ 13

вы сказали, что ваш главный вопрос:

почему мне приходится беспокоиться о кодировании значения скрытого поля ввода в форме. Я бы подумал, что за вас позаботятся.

Ну, ответ потому, что иначе это может привести к проблемам с инъекциями. (Кроме того, скрытые поля не являются местом для хранения конфиденциальной информации, и мне интересно, почему этот ввод скрыт, а также быть скрытым не изменит, как он себя ведет...)

Чтобы исправить вашу проблему, вы можете смешать функции htmlEscape и строки, как в ответе на этот вопрос (Кодировать значение поля скрытой формы)

function htmlEscape(str) {
    return String(str)
        .replace(/&/g, '%26')
        .replace(/ /g, '%20');
}

Надеюсь, это поможет.