Задать вопрос
  • Как запретить нажимать кнопку большезаданного?

    badcasedaily1
    @badcasedaily1
    data engineer, author habr
    Все просто.

    <script>
      $(document).ready(function() {
        var maxQuantity = parseInt($('.pr-quantity').text().trim());
    
        function updateQuantity(val) {
          var $input = $('#input-quantity');
          var currentVal = parseInt($input.val(), 10);
          currentVal = isNaN(currentVal) ? 1 : currentVal;
          $input.val(Math.min(currentVal + val, maxQuantity));
    
          if (currentVal + val >= maxQuantity) {
            $('.journal-stepper').last().prop('disabled', true);
          } else {
            $('.journal-stepper').last().prop('disabled', false);
          }
        }
    
        $('.journal-stepper').first().click(function() {
          updateQuantity(-1);
        });
    
        $('.journal-stepper').last().click(function() {
          updateQuantity(1);
        });
    
        $('#input-quantity').keydown(function(e) {
          if (e.which === 38) {
            updateQuantity(1);
            return false;
          }
          if (e.which === 40) {
            updateQuantity(-1);
            return false;
          }
        });
      });
    </script>
    Ответ написан
    1 комментарий
  • Как в JS добавить вторую кнопку Закрыть или Отмена?

    black1277
    @black1277
    Вольный стрелок
    const fn = () => {
      document.getElementById('burger-menu').classList.toggle("burger-hidden");
      document.getElementById('burger-button').classList.toggle("burger-icon-close");
    }
    document.querySelectorAll('.burger-icon').forEach(el=>el.addEventListener('click', fn))
    Ответ написан
    2 комментария
  • Можно ли написать вирус на JavaScript?

    Разумеется никому не нужен браузер, который вам позволит, не спрашивая пользователя, сделать на его машине что-либо серьезное. Фактически, в браузере и API-то толком нет, чтобы, допустим, файловую систему шерстить. Оно там и не нужно, веб-приложение на то и веб, что большинство данных берет с сервера, в отличие от приложения десктопного.
    Другое дело, что в браузере можно искать уязвимости, и пытаться их эксплуатировать, но "на чем" будет написан ваш вирус в таком случае - вопрос конкретной уязвимости. Если это будет удаленное выполнение кода, то на js вы скорее всего напишете лишь непосредственно эксплоит, а полезная нагрузка уже должна быть в нативном коде платформы жертвы.
    Писать обыкновенные вирусы на языках вроде C/C++/C# можно потому, что они исполняются как процессы операционной системы, и имеют доступ либо к нативному API, либо к API некоей плафтормы, такой как .NET. А эти API имеют достаточно средств для доступа к системе - достаточно лишь заставить жертву запустить тело вируса и, возможно, дать повышенные привелегии (хотя тем же шифровальщикам повышенные привелегии совсем не нужны - им ничто не мешает перезаписывать несистемные (пользовательские) файлы и вымогать деньги за дешифратор). В браузере таких средств нет. Если они и появятся, то тогда наверняка будет какой-либо механизм четкого разграничения доступа.
    Максимум что можно сделать, как сказал Itvanya - завалить движок js хламом (навыделять памяти, запилить кучу таймеров), с контролем съедаемых ресурсов сейчас у браузеров плоховато.
    Ответ написан
    Комментировать
  • Можно ли написать вирус на JavaScript?

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

    Если мы мельком полистаем список уязвимостей, то увидим, что во многих из них фигурирует JS. Вот график взятый с того же сайта:
    RXmc_1mXxXA.jpg
    На нем прекрасно видно динамику уязвимостей приводящих к удаленному выполнению кода (красная линия). Отсюда логичный вывод - js можно использовать как эксплоит.

    Некоторые предыдущие ораторы неверно отмечали - браузер, как и любое другое полноценное приложение, имеет доступ к файловой системе (тот самый обычный доступ, когда можно писать, читать, создавать не системные файлы) посредством API операционной системы (например: WinAPI для windows). Внутри это все выглядит как системный вызов - программа передает управление на уровень ядра, предварительно сказав, что нужно открыть\создать\записать такой-то файл. Значит, нам нужен ассемблерный (да-да, не удивляйтесь) код, на который наш эксплоит передаст управление.

    Ок. Теперь перейдем к самому эксплоиту. Есть такая техника - heap spraying: мы берем нашу полезную (вредную) нагрузку и заполняем ей всю память:
    var buf = new Array();
    // заполним 200МБ памяти
    for(var i = 0;  i != 200; ++i) {
      buf[i] = nop + shellcode;
    }


    И, вполне возможно, что мы перезапишем определенные области (не буду вдаваться в подробности) и сможем выполнить наш shellcode. И да, как сказал riot26 - браузер после такого, скорее всего, крэшнется ... но нам это уже не важно - код будет внедрен и выполнен. Конечно, это банальщина и есть еще 100500 различных вариантов, о которых вам никто не расскажет, но идея ясна.

    PS пользуясь случаем - передаю привет людям в погонах!
    Ответ написан
    2 комментария
  • Как правильно собрать проект из куча файлов html, css, js?

    @Giperoglif
    1. Не мучайтесь и используйте фрэймворк. Yii2/Laravel/Symphony etc.
    2. Для статики используйте Webpack и собирайте им.
    Ответ написан
    1 комментарий
  • Какие есть хорошие способы сделать сайт приватным полностью?

    hahenty
    @hahenty
    ('•')
    Надо просто у знающих клиентов в hosts прикрепить секретное имя к адресу. Приходящие клиенты по айпи без правильного имени хоста попадут на "it works" страницу, по стандартной настройке апача. И регистрировать доменное имя необязательно в таком случае.

    В любом случае, такая "скрытность" потребует от клиентов какого-нибудь опознавательного знака: имя хоста (мой пример), пароль, ключ шифрования.

    Есть еще похожий вариант, когда у знающих клиентов самоподписанный сертификат находится в доверенных.
    Ответ написан
    Комментировать
  • Какие есть хорошие способы сделать сайт приватным полностью?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Локальная HTML-страничка с одной кнопкой: "Вход".
    Форма отправляет POST-запрос с одним динамическим полем (токеном) на основе паблик ключа, заранее полученного от сервера (hardcoded).
    Ответ написан
    Комментировать
  • Какие есть хорошие способы сделать сайт приватным полностью?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Почему бы вам не ограничить доступ к сайту через htaccess только конкретные IP.

    Order deny,allow
    deny from all
    # Список IP через пробел, с которых доступ разрешен
    Allow from 194.111.70.48 194.78.47.128


    В Cpanel есть такая штука, как "защита от личеров". Можно поставить пароль к директории и только после ввода пароля пользователь увидит сайт
    Ответ написан
    1 комментарий
  • Какие есть хорошие способы сделать сайт приватным полностью?

    @forspamonly2
    добавить basic авторизацию, а клиентам давать ссылки с прописанными логином и паролем вида http://user:password@domain.com/
    Ответ написан
    Комментировать
  • Какая логика у этого кода?

    @historydev Куратор тега JavaScript
    Mistkerl, drück den Knopf.
    Потому-что этот алгоритм ищет наибольшее число в массиве.
    15 > 3 - поэтому в max 15

    Если точно как он работает:
    max - 3
    max - 5
    max - 15

    Остальное отбрасывается т.к. оно меньше текущего состояния max и условие не отрабатывает.
    Ответ написан
    Комментировать
  • Какая логика у этого кода?

    xez
    @xez
    TL Junior Roo
    Потому, что когда i равно 3, item равно 15, а max равен 5.
    15 больше 5, по этому в max присваивается значение 15.
    Ответ написан
    Комментировать
  • Как сделать кнопку для скроллинга до нужного элемента?

    @esvlad
    Веб-разработчик
    Это называется якорь.
    Ответ написан
    Комментировать
  • Какой размер резервной области жесткого диска HDD?

    Jump
    @Jump
    Системный администратор со стажем.
    Какой размер резервной области жесткого диска HDD?
    Это известно только производителю, и цифру можно назвать только для конкретного экземпляра. Заметьте не линейки или модели, а именно жесткого диска. Рассчитать никак нельзя.
    Непонятно для чего такая информация может понадобится.
    Если количество переназначенных секторов большое и растет - диск менять и все дела.
    Ответ написан
    6 комментариев
  • Как выводить на сайт изображение, которое храниться вне корня сайта?

    GavriKos
    @GavriKos
    Зачем вопросы дублируете? Вам же уже дали несколько ответов тут: Как отобразить изображение которое храниться вне каталога сайта?
    Вот там и спрашивайте.
    Ответ написан
    Комментировать
  • Как сделать замену текста на ссылку с помощью JavaScript?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Погуглите «url regexp» и станет вам щастье.
    Ответ написан
    1 комментарий
  • Как сделать замену текста на ссылку с помощью JavaScript?

    mokeev1995
    @mokeev1995 Автор вопроса
    fullstack web dev
    так, я разобрался, всем спасибо. код

    функция для сего действия
    //------------------------------------------------------------------------------
    //-----------------------------findAndReplaceLink-------------------------------
    //------------------------------------------------------------------------------
    
    function findAndReplaceLink(inputText) {
        function indexOf(arr, value, from) {
            for (var i = from || 0, l = (arr || []).length; i < l; i++) {
                if (arr[i] == value) return i;
            }
            return -1;
        }
    
        function clean(str) {
            return str ? str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#039;') : '';
        }
    
        function replaceEntities(str) {
            return se('<textarea>' + ((str || '').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;')) + '</textarea>').value;
        }
        function se(html) {return ce('div', {innerHTML: html}).firstChild;}
        function ce(tagName, attr, style) {
            var el = document.createElement(tagName);
            if (attr) extend(el, attr);
            if (style) setStyle(el, style);
            return el;
        }
        function setStyle(elem, name, value){
            elem = ge(elem);
            if (!elem) return;
            if (typeof name == 'object') return each(name, function(k, v) { setStyle(elem,k,v); });
            if (name == 'opacity') {
                if (browser.msie) {
                    if ((value + '').length) {
                        if (value !== 1) {
                            elem.style.filter = 'alpha(opacity=' + value * 100 + ')';
                        } else {
                            elem.style.filter = '';
                        }
                    } else {
                        elem.style.cssText = elem.style.cssText.replace(/filter\s*:[^;]*/gi, '');
                    }
                    elem.style.zoom = 1;
                };
                elem.style.opacity = value;
            } else {
                try{
                    var isN = typeof(value) == 'number';
                    if (isN && (/height|width/i).test(name)) value = Math.abs(value);
                    elem.style[name] = isN && !(/z-?index|font-?weight|opacity|zoom|line-?height/i).test(name) ? value + 'px' : value;
                } catch(e){debugLog('setStyle error: ', [name, value], e);}
            }
        }
        function extend() {
            var a = arguments, target = a[0] || {}, i = 1, l = a.length, deep = false, options;
    
            if (typeof target === 'boolean') {
                deep = target;
                target = a[1] || {};
                i = 2;
            }
    
            if (typeof target !== 'object' && !isFunction(target)) target = {};
    
            for (; i < l; ++i) {
                if ((options = a[i]) != null) {
                    for (var name in options) {
                        var src = target[name], copy = options[name];
    
                        if (target === copy) continue;
    
                        if (deep && copy && typeof copy === 'object' && !copy.nodeType) {
                            target[name] = extend(deep, src || (copy.length != null ? [] : {}), copy);
                        } else if (copy !== undefined) {
                            target[name] = copy;
                        }
                    }
                }
            }
    
            return target;
        }
    
        var replacedText = (inputText || '').replace(/(^|[^A-Za-z0-9А-Яа-яёЁ\-\_])(https?:\/\/)?((?:[A-Za-z\$0-9А-Яа-яёЁ](?:[A-Za-z\$0-9\-\_А-Яа-яёЁ]*[A-Za-z\$0-9А-Яа-яёЁ])?\.){1,5}[A-Za-z\$рфуконлайнстРФУКОНЛАЙНСТ\-\d]{2,22}(?::\d{2,5})?)((?:\/(?:(?:\&amp;|\&#33;|,[_%]|[A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.~=;:]+|\[[A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.,~=;:]*\]|\([A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.,~=;:]*\))*(?:,[_%]|[A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.~=;:]*[A-Za-z0-9А-Яа-яёЁ\_#%?+\/\$~=]|\[[A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.,~=;:]*\]|\([A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.,~=;:]*\)))?)?)/ig,
                function () { // copied to notifier.js:3401
                    var matches = Array.prototype.slice.apply(arguments),
                        prefix = matches[1] || '',
                        protocol = matches[2] || 'http://',
                        domain = matches[3] || '',
                        url = domain + (matches[4] || ''),
                        full = (matches[2] || '') + matches[3] + matches[4];
    
                    if (domain.indexOf('.') == -1 || domain.indexOf('..') != -1) return matches[0];
                    var topDomain = domain.split('.').pop();
                    if (topDomain.length > 6 || indexOf('info,name,aero,arpa,coop,museum,mobi,travel,xxx,asia,biz,com,net,org,gov,mil,edu,int,tel,ac,ad,ae,af,ag,ai,al,am,an,ao,aq,ar,as,at,au,aw,ax,az,ba,bb,bd,be,bf,bg,bh,bi,bj,bm,bn,bo,br,bs,bt,bv,bw,by,bz,ca,cc,cd,cf,cg,ch,ci,ck,cl,cm,cn,co,cr,cu,cv,cx,cy,cz,de,dj,dk,dm,do,dz,ec,ee,eg,eh,er,es,et,eu,fi,fj,fk,fm,fo,fr,ga,gd,ge,gf,gg,gh,gi,gl,gm,gn,gp,gq,gr,gs,gt,gu,gw,gy,hk,hm,hn,hr,ht,hu,id,ie,il,im,in,io,iq,ir,is,it,je,jm,jo,jp,ke,kg,kh,ki,km,kn,kp,kr,kw,ky,kz,la,lb,lc,li,lk,lr,ls,lt,lu,lv,ly,ma,mc,md,me,mg,mh,mk,ml,mm,mn,mo,mp,mq,mr,ms,mt,mu,mv,mw,mx,my,mz,na,nc,ne,nf,ng,ni,nl,no,np,nr,nu,nz,om,pa,pe,pf,pg,ph,pk,pl,pm,pn,pr,ps,pt,pw,py,qa,re,ro,ru,rs,rw,sa,sb,sc,sd,se,sg,sh,si,sj,sk,sl,sm,sn,so,sr,ss,st,su,sv,sx,sy,sz,tc,td,tf,tg,th,tj,tk,tl,tm,tn,to,tp,tr,tt,tv,tw,tz,ua,ug,uk,um,us,uy,uz,va,vc,ve,vg,vi,vn,vu,wf,ws,ye,yt,yu,za,zm,zw,рф,укр,сайт,онлайн,срб,cat,pro,local'.split(','), topDomain) == -1) {
                        if (!/^[a-zA-Z]+$/.test(topDomain) || !matches[2]) {
                            return matches[0];
                        }
                    }
    
                    if (matches[0].indexOf('@') != -1) {
                        return matches[0];
                    }
                    try {
                        full = decodeURIComponent(full);
                    } catch (e){}
    
                    if (full.length > 55) {
                        full = full.substr(0, 53) + '..';
                    }
                    full = clean(full).replace(/&amp;/g, '&');
    
                        url = replaceEntities(url).replace(/([^a-zA-Z0-9#%;_\-.\/?&=\[\]])/g, encodeURIComponent);
                        var tryUrl = url, hashPos = url.indexOf('#/');
                        if (hashPos >= 0) {
                            tryUrl = url.substr(hashPos + 1);
                        } else {
                            hashPos = url.indexOf('#!');
                            if (hashPos >= 0) {
                                tryUrl = '/' + url.substr(hashPos + 2).replace(/^\//, '');
                            }
                        }
                        return prefix + '<a href="'+ (protocol + url).replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;') + '" target="_blank">' + full + '</a>';
                });
    
        return replacedText;
    }
    Ответ написан
    Комментировать