безопасность, не выполнять javascript
Добрый день.
Возник такой вопрос — как вывести javascript код, не выполняя его. Простейшее приложение tasklist, пользователь может вводить любые данные в качестве текста таска. Надо затем отдавать это также текстом. И вопрос сразу в догонку — какие еще могут возникнуть проблемы безопасности. пример приложения — http://radiowav.es:3000 |
Ну попробуйте, что-то вроде этого:
<input type='button' value='push' onclick='a()'> <script> var b = false; function a() { if(b) { alert('1') //тут ваш код } } </script> В общем изменяете все что хотите, но пока b = false, код не заработает ======= Насчет приложения, уберите эти алерты, мол создано, исправлено.. |
ну основной вопрос — как вывести javascript-код текстом, по аналогии с mysql-инъекциями.
<!doctype html> <html> <head> <script> function test(){ var string = 'alert("hack it")'; document.getElementById('example').innerHTML = string; } </script> </head> <body onLoad="test()"> <h3 id="example"></h3> </body> </html> |
ой, а так работает))
дело в том, что это строка? |
tadjik1,
да |
<div id='div'></div> <script> var a,b,c,d; function a() { } a = {} b = [] document.getElementById('div').innerHTML = document.getElementsByTagName('script')[0].innerHTML </script> |
хорошо. тогда полная история =)
у меня есть файл tasks.json, в котором массивом сохранены объекты (таски). {"id":"7","text":"ыав","lastupdate":"28.03.2012","complete":false} вот если "text":"alert('1')", то он запускается, несмотря на то, что я добавил проверку и на клиенте, и на сервере (node.js) server.js newTask.text = String(post.text); index.html $('#taskList').append('<li id="' + String(value.id) + '">' + String(value.text) + '</li>'); |
Может тупость сморожу, попробуй взять в двойные кавычки: ""alert('1')""
|
всё равно сработало =((
сработала вот такая строчка — "<script>alert('11')</script>" просто алерт не работает |
кстати, на форуме где-то видел, заменяли специальные знаки <, > и /.
|
нашел вот. называется это xss, примитивная защита такая —
string.replace(/&/g, "&").replace(/>/g, ">").replace(/</g, "<").replace(/"/g, """); гуру, подскажите, какие еще могут быть проблемы и как от них защититься? не говорю о целенаправленных атаках, а просто вот от таких «болванов». |
|
нет, зачем?
$.getJSON('tasks.json', function(data) { $(data.tasks).each(function(index,value){ if(!value.complete){ $('#taskList').append('<li id="' + value.id + '">' + value.text + ' <input type="button" class="edit" value="edit"><input type="button" class="complete" value="mark complete"></li>'); } }); }); вставляет в html тэги <script></script>, браузер их исполняет |
Стоп...так вы пробовали в таксе написать: { id: "5", text:""alert('1')""... }
|
9xakep, всё верно, так не работает. а вот так { id: "5", text:""<script>alert('1')</script>""... } запускается. в общем, решение — это заменить их на ascii коды. только теперь новая проблема — не пойму как их отображать правильно для клиента =)
|
вы, наверное, имели ввиду этот. он в данном контекте не подходит.
через регулярки хорошо получается, но не пойму как их обратно клиенту хтмл кодом отдавать, а не текстом, чтобы красиво было. сам механизм не могу никак понять( |
str.replace(new RegExp("<", "mig"), "<");
|
Ну попробуйте при отправке проверять если в строке: <script> или </script>
<script> var a = ''<script>asd</script>'' if((/\<script\>/).test(a)) { a = a.replace(/\<script\>/, '') a = a.replace(/\<\/script\>/, '') alert(a) } else { alert('noscript') } </script> =========== Мда...опять тупость сморозил... |
Цитата:
|
Тогда code еще в добавок
Хотя там не грамотно сказано, код и без этих тегов читаться не будет: function a() { alert('') } <code><script>alert('a')</script></code> ============= А скрипт и без этих тегов выполняется.. =========== <plaintext> <script> alert('a') </script> А вот это уже что-то рабочее(в хроме), в других браузерах не проверял.. |
Так пусть юзает plaintext
==== pre никогда не работал ктстаи, хз почему(ну у меня по крайней мере) |
Maxmaxmахimus,
Почему не сделали то? Работает же? P.S. у него есть закрывающий тег если что В опере тоже работает: facebook: ![]() |
Цитата:
|
...
<plaintext> <script> alert('1') </script> </plaintext> <script> alert('2') </script> ========== Ок...лохонулся ======= Единственный закрывающий тег: поместить скрипт в конец страницы, т.к. он не закрывает код сверху, но ниже его не остановить... |
Часовой пояс GMT +3, время: 01:38. |