Угрозы безопасности при получении строки запроса по ссылке ‹script›?

В другом вопросе я спросил, можно было сделать так:

<script type = "text/javascript" src = "/js/myScipt.js?v=3"></script>

а затем получить значение v в myScipt.js с помощью jQuery или JavaScript. Судя по всему, да, это можно сделать так:

var getV = document.currentScript.src.split("?v=")[1];      // JS
var getV =  $('script').last().attr("src").split("?v=")[1]; // jQuery

Мой новый вопрос: создаю ли я какую-либо угрозу безопасности, которую можно использовать, делая это? Если да, то есть ли способ очистить значение queryString, чтобы устранить риск?

В случае, если это имеет значение, myScript.js использует jQuery для вставки в страницу некоторого HTML-кода, который он создает (некоторые элементы div и изображение) на основе некоторых условий.


person John    schedule 26.10.2016    source источник
comment
Тег script помещен в dom вашим кодом или чем-то сторонним?   -  person Ross Bush    schedule 26.10.2016
comment
Тег script помещается в DOM непосредственно перед закрывающим тегом body. Это мой собственный скрипт, который не использует AJAX и не взаимодействует с сервером каким-либо иным образом.   -  person John    schedule 26.10.2016
comment
Теперь у вас есть введенная пользователем строка в переменной. Само по себе нет проблем с безопасностью. Важно то, что вы продолжаете делать с этой переменной. Если вы выполняете его как JavaScript, используя eval(), то, очевидно, у вас проблема с межсайтовым скриптом. Если вы пишете его в HTML-разметке (например, с помощью innerHTML, $el.html() или document.write()), то у вас возникает проблема с внедрением HTML, которая также приводит к межсайтовому скриптингу. Если вы безопасно создаете HTML, используя текст DOM и свойства атрибутов, тогда все в порядке.   -  person bobince    schedule 29.10.2016
comment
@bobince - Спасибо за ответ. Я думаю, что со мной все в порядке, поскольку я безопасно строю HTML.   -  person John    schedule 31.10.2016


Ответы (1)


Что ж, безопасность — это не то слово, которое я бы использовал для обозначения javascript. Весь клиентский код доступен для просмотра, редактирования и эксплуатации. На самом деле не имеет значения, что вы делаете в javascript, если код вашего сервера предполагает, что пользовательский ввод может быть подделан/поврежден. Все фреймворки javascritp закладывают в браузер много логики и, таким образом, позволяют пользователю возиться с ней, и это не значит, что эти фреймворки плохие, кроме того, запрос также может быть подделан, поэтому краткий ответ: ... дыр в безопасности нет в ваш клиент, но на вашем сервере. Ваш клиент — это «большая дыра» по определению, и все, что из нее исходит, должно рассматриваться как опасное.

Вы должны спросить себя: «Может ли пользователь запросить/отправить что-то с/на сервер, что приведет к нежелательному выполнению»? Вы можете позволить пользователю-клиенту попросить отформатировать ваш жесткий диск или получить все пароли вашего пользователя. Ожидайте, что это произойдет. Но... позволит ли это ваш сервер?

person user5328504    schedule 26.10.2016
comment
Мой скрипт вообще не взаимодействует с сервером, т.е. нет AJAX-запросов. По сути, он просто создает HTML-разметку и вставляет ее в документ. Возник вопрос о строке запроса, потому что в зависимости от значения строки запроса сценарий будет использовать разные имена классов. В таком случае возможно ли, чтобы что-то вредоносное было отправлено на сервер? Я буду использовать скрипт на нескольких сайтах, поэтому я решил, что проще использовать строку запроса, чем иметь разные версии myScipt.js на каждом сайте с изменением только одной переменной в коде. - person John; 26.10.2016
comment
Наличие строки запроса для обслуживания разных версий скрипта вообще не кажется разумным. Я не знаю, что делает код вашего сервера, но если он только считывает значение и возвращает скрипт, все должно быть в порядке. Обратите внимание, что пользователи могут вручную попробовать другие строки запроса, чтобы получить другие версии. - person user5328504; 01.11.2016
comment
Спасибо за ответ. Строка запроса в основном просто изменит HTML, который я создаю с помощью jQuery. Например, myScript.js?v=full может использовать класс Bootstrap .container-fluid, а myScript.js?v=container вместо этого может использовать класс .container. Строка запроса будет зависеть от макета сайта, на котором я ее использую. Это простой пример, но он в основном описывает то, что я пытаюсь сделать. - person John; 02.11.2016
comment
Я понимаю. Проблемы безопасности, связанные с javascript, бывают разными. Я думаю, что самые главные проблемы связаны с 1. Использованием eval() для вещей, которые каким-то образом загружаются из пользовательского ввода 2. Пользовательский интерфейс, управляемый javascript, в котором пользователь может изменить выполнение программы таким образом, что он / она сможет заставить сервер выполнить или получить защищенный код/данные. в вашем случае это не проблема - person user5328504; 04.11.2016
comment
Спасибо за объяснение и извините, что пропустил его раньше. Все это имеет смысл для меня, и я чувствую себя лучше, делая это и не создавая угрозы безопасности. Спасибо еще раз! - person John; 27.11.2016