• Как организовать правильное подключение шрифтов?

    werty1001
    @werty1001
    undefined
    Типографика самая важная часть сайта, поэтому на мой взгляд лучше грузить шрифты со своего сайта, а не сторонних сервисов, даже гугла, я за пункт 1.

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

    petermzg
    @petermzg
    Самый лучший программист
    function Person(){} - Вы обьявляете функцию с именем Person.
    var person = Person() - Вы вызываете функцию Person и результат сохраняете в переменную person
    var person = new Person()- Вы создаете новый обьект использую функцию-конструктор Person
    Ответ написан
    Комментировать
  • Не оплатил домен, на следующий день его сразу купили - что за бред?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    ru домены освобождаются через месяц, com - 39 дней, так что вряд ли "сразу"
    Ответ написан
    Комментировать
  • Каким методом шифровать пароли для хранения в базе данных?

    sayber
    @sayber Куратор тега PHP
    Да, я программирую на PHP и еще асинхронно!
    Ответ написан
    Комментировать
  • Проблема с выводом сообщений php. Поможете решить её?

    Ashlst
    @Ashlst
    Фанат эстетики и красивых решений.
    Почему $num = 25; ????

    UPD: На Вашем месте я бы переписал заново,потому что это странный код:
    1.Не надо использовать mysql,это морально устаревшая и небезопасная фича..пользуйтесь PDO.
    2.
    mysql_connect('localhost','root','')
    - вся системная информация типа паролей,хостов,БД выносится в отдельный файл и хранится в виде констант.
    3. Вся полученная информация из форм должна проходить проверки (обрезаем html теги,пробелы и тд )
    4.Желательно так же отслеживать ошибки при работе с БД.
    5.Нехорошо мешать html и php в большом количестве,получается трудно читаемый код.Используем шаблонизаторы.
    5.С кучей if`ов,надо что-то делать....серьезно...это боль для глаз)
    6. Чтобы выводилось последнее сообщение,смотрите в сторону ORDER BY и DESC

    p.s Все выше написанное - лично мое субъективное мнение.
    Ответ написан
    1 комментарий
  • Как сделать высоту iframe по содержанию, полученному с другого домена?

    Petroveg
    @Petroveg
    Миром правят маленькие с#@&ки
    Для решения задачи «в лоб» можно использовать общение между окнами.

    Исходный документ
    var iframe = document.createElement('iframe');
    
    window.addEventListener('message', function (e) {
    	iframe.height = e.data;
    });
    iframe.src = '...';
    iframe.scrolling = 'no';
    iframe.width = 300;
    iframe.height = 300;
    document.body.appendChild(iframe);

    Загружаемый документ
    window.addEventListener('load', function () {
    	parent.postMessage(document.documentElement.scrollHeight, '*');
    });

    Во втором аргументе postMessage можно указать домен исходного документа.
    Пример
    Ответ написан
    7 комментариев
  • Как защитить сайт от вредоносных атак?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    1. Пользователь всегда врет. Все без исключения входящие данные ОБЯЗАТЕЛЬНО должны валидироваться, в случае ошибки - шлем на йух.
    2. Для средних систем - вполне норм подход: во всех публичных методах выполнять обязательную проверку всех аргументов простых типов, чуть что не так - исключение. Так как проверок будет море - критично время их выполнения, можете посмотреть мой проектик: https://github.com/ko-ko-ko/php-assert

    Пример использования:
    /**
     * @param string $login
     * @param string $password
     * 
     * @return int
     * @throws \InvalidArgumentException
     */
    public function login($login, $password)
    {
        Assert::assert($login, 'login')->lengthBetween(4, 16);
        Assert::assert($password, 'password')->lengthBetween(6, 20);
        
        // Business logic here
    }

    Код конечно после таких действий не самый красивый, но надежный. В случае действительно крупного проекта - вполне норм делать проверки в приватных и защищенных методах. Многомерные массивы как аргументы методов можно использовать только в безвыходных ситуациях.
    3. Гетеры и Сеттеры - обязательно. По хорошему классов с публичными свойствами быть не должно.
    4. Права на запуск ТОЛЬКО у точек входа, например index.php.
    5. Log - твой друг. Каждое исключение обязательно должно сохраняться для выяснения причин.
    6. Жесткая блокировка типов запросов. Например на главной - только GET, на login - только POST.
    7. По хорошему в мир должен смотреть только 80/443 порты.
    8. Блокировка сканнеров - в случае подключения запросов на то, чего у вас нет публично, pma (phpmyadmin) например - банить по ip на час, или больше. *Если у вас таки есть публичный pma - сами себе злобные буратины))
    9. По хорошему - стоит снимать метрики работоспособности вашей системы, например в zabbix, это косвенно решает проблему безопасности: отклонение метрик - маячок.
    10. Система контроля версий на проде обязательна, но с заблокированным push + системные файлы vcs закрыты для мира.
    11. Доступ к проду только у сисадмина и тим лида.
    12. Ручные правки кода в не релизное время выполняет тимлид и только после апрува руководства. Эти правки ОБЯЗАТЕЛЬНО должны быть сохранены в репозиторий в ближайшее время, например в течении 3-х дней.
    Ответ написан
    1 комментарий
  • Как организовать учёт трафика в сети?

    @handbrake
    как вариант - отдельный маршрутизатор на линуксе (можно готовый, Zential например), возможности стремятся к бесконечности, материалов в сети тьма.
    в цену Керио Контрол, например, вполне поместится аппаратный роутер микротик или недорогой системник под линукс.
    Ответ написан
    7 комментариев
  • Как добавить в дочерний класс функцию с PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Просто классическая коллекция заблуждений, связанных с бд-врапперами.

    1. Не надо писать функцию select().

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

    В итоге из практически натурального английского "выбрать все поля из таблицы пользователей, где логин равен тому-то и пароль тому-то" получаем на выходе непонятные иероглифы, про значение которых автор и сам забудет через пару месяцев.
    $this->db->select('*', 'ftl_workers', "login = ? AND password = ?");

    в этом коде автор экономит себе три слова.
    Вопрос: стоит ли эта экономия читабельности и портируемости?
    Вопрос: а что будет, когда автор узнает о других операторах SQL, таких, как GROUP BY, JOIN и пр.?
    Неужели так сложно написать нормальный SQL запрос:
    $this->db->get('SELECT * FROM ftl_workers WHERE login = ? AND password = ?");

    Если же хочется нормальный квери билдер, то надо взять и посмотреть сначала на существующие. И понять, что квери-билдеры пишутся не для экономии трех слов.

    2. Самые развесистые грабли. Класс бизнес-логики наследует классу БД. ООП же! Надо же что-то наследовать! При этом совсем не приходит автору в голову, что, скажем, пользователь - это не база данных! И нет ни одной причины наследовать первого от второй. БД может присутствовать в классе как сервис. Как свойство. Но не как. праордитель

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

    4. Как всегда, исключение кидается только для того, чтобы ТУТ ЖЕ его поймать и радостно вывалить на экран. И здесь мы опять видим совершенно поголовное убеждение пользователей похапе в том, что они являются единственными и эксклюзивными пользователями своего сайта. Средний похапешник совершенно искренне не понимает, что у сайта могут быть и другие пользователи, которые эти сообщения ни к чему. А сам он не всегда сидит за монитором, чтобы увидеть сообщение об ошибке.
    И это при том, что сам РНР обработает исключение в сто раз лучше - главное просто ему не мешать. Подробнее можно прочитать здесь: phpfaq.ru/pdo#exceptions

    В итоге, без переменных класса, функции Селект и "обработчика" ошибок от класса не остаётся ничего. И это правильно. PDO - это уже дб-враппер, и "расширять" его - только портить. Во всяком случае, начинающим похапешникам настоятельно рекомендуется этого не делать, а научиться сначала пользоваться родным PDO.

    Если уж так уж прям хочется сэкономить одну строчку, то изменения нужны совсем крошечные:
    - надо сделать так, чтобы prepare возвращала statement, и singleton по вкусу.
    получается https://github.com/colshrapnel/thebestpdowrapper
    С нормальным враппером код остаётся читаемым, но в то же время кратким:

    class UserAuth {
        function check($user, $pass) {
            $sql = 'SELECT * FROM ftl_workers WHERE login = ? AND password = ?';
            return DB::prepare($sql)->execute([$user, $pass])->fetch();
        }
    }
    include 'bestpdo.php';
    $ua = new UserAuth();
    $ua->check('admin', 'pqwe');
    Ответ написан
    5 комментариев
  • Как организовать алгоритм добавления в две таблицы одновременно?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Откройте для себя славный пусть DDD.

    Вообще у вас обычная связь Many-to-Many, в этом случае у вас должно быть три таблицы:
    card с полями id, car_number и всечто относится к машинам
    goods с полями id. и остальными специфичными только для goods полями
    и что-то типа goods_cars_link с полями goods_id, car_id, которые связаны через foreign key со своими таблицами.
    Ответ написан
    9 комментариев
  • Как убрать эффект обводки у ссылки?

    iiil
    @iiil
    Инженер и вэб-дизайнер, рисую.
    Уважаемый @hadra , не городи х..рню! Вопрос стандартный и всегда решается a { outline: none;}
    Именно это раздражает верстальщиков и пользователей и именно таким образом борются. Тот факт, что автор указал при нажатии - говорит лишь о том, что автор видит эту обводку только при нажатии. Где Вы видели обводку в другом случае? Ее надо отдельно прописывать, и если так сделано, то автор всяко догадается, как ее отменить для нажатой кнопки.
    Теперь собственно информация для @tatu - если не срабатывает - работаем следующим образом. Пишем a { outline: none!important;}, если помогает - можете и так оставить, но это костыль. Необходимо найти стили, где приписано иначе, вооружившись инспектором кода или firebug и добиться нужного результата без использования important. Если не помогает - то где-то в стилях уже прописано с important - тем более - инспектор кода и ищите, какой стиль перекрывает Ваше правило.
    Ответ написан
    2 комментария
  • Принципы работы сетей для домохозяек - TCP/IP, NAT, Proxy, наглядное руководство?

    @v_prom
    на youtube есть канал Дмитрия Бочило, он сейчас выпускает видео про сетевые технологии, правда их пока очень мало, но очень доступно рассказывает. + много других видео про железки и разные технологии, может найдешь то, что заинтересует.
    Ответ написан
    1 комментарий
  • Каким образом малвари попадают на сайт?

    sledopit
    @sledopit
    Как правило такая фигня распространяется двумя способами:
    А. дыра в сайте. ищется путём усердного чтения логов и поиска шеллов.
    совсем недавно я помогал товаришу с похожей штукой (на ресурсе воткнулись iframe'ы). порядок действий был примерно такой:
    1. сравнение с бэкапом и выявление изменнённых / новых файлов
    2. изучение новых файлов, естественно, один из них оказался шеллом ( .cache_rcnzyz.php )
      (если нет бэкапов, то ССЗБ стоит поискать на стандартные функции шеллов (в случае с php это всякие shell_exec и base64 [стоит учитывать, что свой код так же может их использовать, поэтому искать нужно внимательно])
    3. изучение логов на предмет доступа и заливки данного шелла. у меня были примерно такие строки:
      xxx.xxx.xxx.xx - - [09/Jan/2013:18:09:46 +0400] "POST /images/stories/.cache_rcnzyz.php HTTP/1.0" 200 501 "-" "Mozilla/5.0 (Windows NT 5.1; rv:8.0) Gecko/20100101 Firefox/8.0"

      к сожалению злоумышленник оказался достаточно осторожным и с этого ip (который к тому же оказался и зарубежным, т.е. доблестной полиции не пожалуешься) других обращений не было. нужная дыра была найдена по времени создания файла (+- пара минут).
      zzz.zzz.zzz.zz - - [08/Jan/2013:00:02:21 +0400] "POST //index.php?option=com_jce&task=plugin&plugin=imgmanager&file=imgmanager&version=1576&cid=20 HTTP/1.0" 200 668 "-" "BOT/0.1 (BOT for JCE)"
    ура, дырка найдена, заплатка сделана, злоумышленник забанен.

    В. человек с ftp доступом к ресурсу подхватил троян (про ssh слышал лишь один раз). ну тут менять пароли и фиксить заражённую машину.
    Ответ написан
    3 комментария