Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   "Засады" пользовательского ввода (https://javascript.ru/forum/events/43182-zasady-polzovatelskogo-vvoda.html)

Den Brown 25.11.2013 19:35

"Засады" пользовательского ввода
 
Приветствую всех! и спасибо, что заглянули в эту тему.

Пишу JS в котором prompt спрашивает пользователя "как много вы ходите создать следующих записей"

после чего полученная переменная проверяется на число, округляется, проверятся на соотвествие диапазону (см. код проверки ниже) и передается в следущий цикл в качестве счетчика i<этоЧисло.

В цикле через AJAX API идет создание новых записей на сервере.

Но меня терзают параноидальные сомнения: а может ли пользователь ввести, например фрагмент JS кода, который потом исполнится? Исполнится ли он после моей проверки? Что еще может подкинуть злодей? спасибо

Вот код проверки (спасибо Учебнику и его Автору):

/*
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}

var quantity = prompt('How many records do you want to create? (Choose from 1 to 10)', '');

if (!isNumeric(quantity)) { // check is it a number?

quantity=null;

alert("Please enter a number from 1 to 10");

} else {

quantity=Math.floor(+quantity); //to number and round to floor


if (quantity<=0||quantity>10) { //check is it less than 1 or more than 10

quantity=null;

alert("Please enter a number from 1 to 10");

}
}

if(quantity!=null){

for (var i=0; i<quantity; i++) {

ТЕЛО ЦИКЛА

}
}
*/

cyber 25.11.2013 19:49

Den Brown, проверку нужно проводить на сервере, а не на клиенте.
Цитата:

Сообщение от Den Brown
Но меня терзают параноидальные сомнения: а может ли пользователь ввести, например фрагмент JS кода, который потом исполнится?

Да, может

Den Brown 25.11.2013 20:18

Цитата:

Сообщение от cyber (Сообщение 282717)
Den Brown, проверку нужно проводить на сервере, а не на клиенте.

Полностью согласен. И опишу ситуацию подробнее:

Стандартная страница какой-то записи на какой-то платформе работающей на JAVA.

Для того, чтобы не приходилось возиться с созданием кастомных страниц и их контроллеров, на эту стандартную страницу можно добавить кнопку, под которой лежит JS код который делает AJAX SOAP вызовы на сервер для выполнения каких то нехитрых операций с записями, как-то добавить новую дочернуюю запись, перенумеровать дочерние записи. При этом не предполагается, что потребуется пользовательский ввод. Но в моем случае он потребовался.

есть еще вариант: после ввода не далется AJAX SOAP колы, а делается стандартный GET вызов на кастомную страницу где в URL загружается ввод как параметр, и контроллер той страницы берет парметр и делает, то что нужно. Но проблема в вредительском вводом в JS так и отстается , кроме этого прибавляется необходимость проверять на контроллере.

так что хочу понять, что можно сделать плохого в принципе в таком случае, и как это предотвратить

а вот и идея: а может не использовать промпт, а поднимать в центре див с селектом и фиксированными вариантами....

Цитата:

Сообщение от cyber (Сообщение 282717)
Да, может


OK,
что он именно может ввести?

как этот ввод может пройти проверку в функции isNumeric(n) и оставаться опасным?

или код можно "положить" даже не доходя по цикла, где ввод ипользуется в качестве счетчика?

спасибо

Den Brown 25.11.2013 21:27

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

cyber 26.11.2013 10:07

Цитата:

Сообщение от Den Brown
как этот ввод может пройти проверку в функции isNumeric(n) и оставаться опасным?

если речь идет от проверки на клиенте , то можно элементарно обойти проверку отправив запрос вручную через консоль


Часовой пояс GMT +3, время: 14:14.