Рискове за сигурността при получаване на низ на заявка от връзката ‹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
Тагът на скрипта поставен ли е в dom от вашия код или от нещо на трета страна?   -  person Ross Bush    schedule 26.10.2016
comment
Тагът на скрипта се поставя в 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