• Как избавиться от переменных при вызове методов?

    @ipokos
    а в чем проблема передавать переменные в метод?
    Как избавиться от переменных при вызове методов?

    сетать их в конструкторе.

    class MyClass{
    
    protected $imgObj;
    
        public function __construct(){
            $this->imgObj = new Image();
        }
    
        public function otherFunction(){
            $name = $this->imgObj->getName();
        }
    }

    Но это плохой способ, т.к. таким образом жестко делается привязка и может понадобиться заново конфижить объект который пришел .

    Лучше будет такой вариант:
    public function __construct(Image $image){
            $this->imgObj = $image;
        }

    нужный объект приходит уже в класс
    Ответ написан
  • Как обезопаситься от шеллов на сервере?

    Vamp
    @Vamp
    Для начала необходимо разделить сайты друг от друга физически. Сами скрипты сайта, временные файлы и файлы сессий.

    Например, структура может быть такая:
    /var/www
      + toster.ru
      |  + site
      |  + sessions
      |  + temp
      + example.com
      |  + site
      |  + sessions
      |  + temp
      + остальные сайты


    В папке site расположены скрипты сайта. Обычно эта папка (или одна из вложенных) является document root сайта.

    В sessions находятся файлы сессий посетителей сайта. Если их не разделять, то взлом одного сайта автоматически дискредитирует сессии всех пользователей остальных сайтов. То есть, взломав example.com, можно стырить сессию администратора toster.ru. Путь к этой папке настраивается директивой session.save_path.

    А в temp находятся временные файлы, загружаемые пользователями через html формы (директива upload_tmp_dir). Туда же неплохо направить и остальные временные файлы, генерируемые функциями tmpfile(), tempnam(), самостоятельным образом (используя результат функции sys_get_temp_dir() для построения пути) или любой другой функцией, которая использует системную временную директорию. К сожалению, директива sys_temp_dir, ответственная за это, появилась только в php 5.5.0. Если у вас более ранняя версия, тогда нужно учитывать момент, что сайты могут ходить в /tmp и нельзя блокировать доступ к этой папке.

    ---

    Далее необходимо настроить нормальные права доступа. Часто в интернете можно видеть советы "делайте chmod 777 на всё". Так делать нельзя. Подобные права доступа как раз наихудшим образом сказываются на безопасности, потому что дают возможность отредактировать любой скрипт на сайте и встроить маленький бэкдор в самый незаметный скрипт, принадлежащий CMS. Надежно избавиться от такого довеска можно будет только полной переустановкой CMS. Или можно загнать весь сайт в систему контроля версий, как предложил Максим Гречушников, и одной командой узнать какие скрпиты были заражены. Тем не менее, одно другое не исключает. Система контроля версий позволит выявить заражение постфактум, а нормальные права не дадут возможности заразить файл в принципе.

    Я рекомендую на папки устанавливать права 755, а на файлы 644. При этом, владельцем всех папок и файлов должен быть кто угодно, но не пользователь, из-под которого запущен веб-сервер или php (например, пользователь, под которым вы сами заходите на сервер по ssh). Но такие права на всё устанавливать тоже нельзя. Сайт в процессе своей работы может генерировать свои временные файлы (например, кешировать что-то в файл, компилировать шаблоны, хранить какие-нибудь настройки), поэтому для папок, в которые сайт может что-то записать, права должны быть другие. Вот здесь уже можно ставить 777 для папок и 666 для файлов. Это довольно кропотливая работа, потому что у каждого сайта (особенно если они на разных CMS) свои папки и часто определение таких папок нетрвиально.

    И права доступа не решают всех проблем. Злоумышленник может встроить вредоносный код в скомпилированный шаблон или отравить кеш. Тогда не помогут ни права (так как для нормальной работы сайту нужно иметь права на запись в такие файлы), ни система контроля версий (так как подобные файлы слишком часто меняются и, как правило, не хранятся в репозитории). Хотя надо сказать, этот способ внедрения сложнее и недолговечнее, чем встраивание в нормальный скрипт.

    И ещё автоматическое обновление сайта перестанет работать. Если CMS позволяет обновить себя через кнопку в веб-интерфейсе админки, то такое обновление не будет работать, так как права доступа не разрешают веб-серверу модифицировать скрипты. Обновлять скрипты теперь можно только вручную от имени пользователя, которому принадлежат все файлы. Безопасность и удобство - разные концы одной палки.

    Даже с учётом всех недостатков - нормально настроенные права доступа на файлы и папки значительно сокращают вектор возможных атак. Так что обязательно разберитесь с этим вопросом.

    ---

    После раскидывания сайтов по своим папкам и настройки прав, необходимо ограничить доступ сайтов друг к другу. Проще всего это сделать настройкой php директивы open_basedir. Эта директива определяет список директорий, внутри которых (а так же во всех вложенных папках) скрипты могут читать и писать. Доступ за пределы этих директорий будет пресекаться. То есть нужно каждому сайту прописать в open_basedir путь к своей папке и к /tmp (если версия php < 5.5.0 и нельзя установить sys_temp_dir).

    Для Apache с mod_php конфигурация прописывается в httpd.conf:

    <VirtualHost *:80>
      ServerName example.com
      php_admin_value open_basedir /var/www/example.com/:/tmp/
      php_admin_value upload_tmp_dir /var/www/example.com/temp/
      php_admin_value sys_temp_dir /var/www/example.com/temp/
      php_value session.save_path /var/www/example.com/sessions/
    </VirtualHost>


    Для php-fpm в конец php.ini файла вписывается специальная секция, определяющая индивидуальную конфигурацию для каждого сайта:

    [HOST=example.com]
    open_basedir /var/www/example.com/:/tmp/
    upload_tmp_dir /var/www/example.com/temp/
    sys_temp_dir /var/www/example.com/temp/
    session.save_path /var/www/example.com/sessions/
    
    [HOST=toster.ru]
    ; конфиг для toster.ru и т.д.


    У open_basedir есть недостатки:

    1. Замедление файловых операций, так как необходимо проверить вхождение каждого открываемого файла в список open_basedir. Если проекты не highload, то некритично.
    2. Есть варианты обхода. Но их далеко не всегда удаётся эксплуатировать. Тем более они закрываются со временем в новых версиях php.
    3. Realpath cache не работает вместе с включенной open_basedir.

    ---

    Есть вариант запускать каждый сайт от своего пользователя. В apache это делается опцией AssignUserId. В php-fpm - отдельной конфигурацией pool. Но в любом случае нужно для каждого сайта создавать не только отдельного юзера, но и группу. При этом права на основную папку сайта (/var/www/example.com) должны быть 750, а группа должна соответствовать той, от которой будет запускаться процесс apache (или пул php-fpm), ответственный за обслуживание сайта.

    Проще показать на примере. После имени файла я буду указывать права, владельца и группу в формате (права, владелец:группа)
    /var/www         (755, root:root)
      + toster.ru    (750, my_user:toster)
      |  + site      (755, my_user:toster)
      |  + sessions  (777, my_user:toster)
      |  + temp      (777, my_user:toster)
      + example.com  (750, my_user:example)
      |  + site      (755, my_user:example)
      |  + sessions  (777, my_user:example)
      |  + temp      (777, my_user:example)
      + остальные сайты - всё аналогично


    my_user - это пользователь, под которым ни в коем случае нельзя запускать веб-сервер и php. Это может быть ваш собственный пользователь, под которым вы заходите на сервер по ssh. В этом случае у вас будут все права на сайт, а у сайта только необходимый минимум.

    <VirtualHost *:80>
      ServerName example.com
      AssignUserId exapmle example
    </VirtualHost>
    <VirtualHost *:80>
      ServerName toster.ru
      AssignUserId toster toster
    </VirtualHost>


    Разумеется, в системе должны быть заранее созданы пользователи с именами toster, example и с одноимёнными основными группами.

    Вобщем, рекомендую более подробно ознакомиться с системой прав и пользователей в линуксе. Пригодится всегда.

    ---

    Более сложным и предпочтительным вариантом является упаковка каждого сайта в свой отдельный виртуальный контейнер lxc/docker. Я не смогу в двух словах описать как это добро настраивать, но эффект будет такой, как будто каждый сайт работает на своём собственном VPS сервере.

    ---

    Ещё немного про базу. Для доступа к базе у каждого сайта должен быть свой собственный логин с паролем. Причем, доступ должен ограничиваться исключительно той базой, в которой находятся данные сайта. И права должны быть не все подряд, а только SELECT, INSERT, UPDATE, DELETE. В редких случаях CMS может самостоятельно создавать таблицы для своих нужд в процессе своей работы (не в процессе первичной установки). В этом случае можно добавить права CREATE, ALTER, INDEX юзеру этого сайта. Иногда бывает в базе есть какие-то процедуры/функции. Для их вызова требуются права EXECUTE.

    ---

    Безопасность - дело большое и очень разнообразное. И уж точно не простое. Всё что я здесь написал - это далеко не полный список. Есть ещё настройки уровня операционной системы (особенно фаервол) и прочего установленного в системе софта. Так же отдельным пунктом идёт система мониторинга и оповещения, которые почему-то никто не делает - не считают нужным разбираться ещё и в этом. Так что если у вас нет хорошего админа в запасе, то проще будет заказать услугу администрирования прямо у того же хостера, у которого вы арендуете VPS. Или найти админа-фрилансера. Или же перевезти сайты на shared хостинг, где администрирование уже включено в ценник, да и сам переезд хостеры часто предлагают сделать бесплатно силами своих админов.
    Ответ написан
  • Как обойти проблему при переносе сайта с хоста на локалку?

    IvanIlyasov
    @IvanIlyasov
    Познаю мир
    Чтобы перенести Prestashop-сайт с хостинга на локалку. Надо сделать следующее:
    1) Очищаем кэш.
    Заходим в /prestashop/cache/smarty/cache и удаляем всё, кроме index.php и last_template_flush.
    Заходим в /prestashop/cache/smarty/cache/compile и удаляем всё, кроме index.php и last_flush.
    Заходим в /prestashop/themes/ваша_тема/cache и удаляем всё, кроме index.php.
    2) Меняем домен в БД.
    Меняем либо через текстовый редактор, либо заранее в phpMyAdmin.
    Таблица ps_shop_url колонки domain и domain_ssl. Меняете домен на localhost (без http:// и других лишних символов.)
    3) Меняем пути к БД в файле конфигурации.
    Открываем в текстовом редакторе /prestashop/config/settings.inc.php
    и меняем на следующее:
    define('_DB_SERVER_', 'localhost');
    define('_DB_NAME_', 'prestashop'); //название БД на локалке
    define('_DB_USER_', 'root'); //ваш логин к БД а локалке
    define('_DB_PASSWD_', '123'); //пароль к БД на локалке

    Если имя сервера отличается от localhost, то его нужно поменять на это значение.
    4) Загружаем на локальный сервер БД и и файлы сайта.
    5) Заходим в админку (в данном случае localhost/admin3200), вводим логин и пароль админа.
    6) Идем в Расширенные параметры >> Производительность, передергиваем Оптимизация Apache (выкл >> Сохранить, вкл >> Сохранить), тем самым обновляем .htaccess.
    Всё.

    Чтобы перенести обратно на хостинг, надо проделать всё тоже самое, только в конце еще один пункт:
    7) Идем в Настройки >> SEO и URL >> внизу страницы кнопка "Генерировать Robots.txt"
    Ответ написан
  • У блока меню плывет верстка, как исправить?

    MhMadHamster
    @MhMadHamster
    или поставьте background-size: 100% 100%; если не надо поддерживать ie8
    картинка сплошной фон так что не заметно особо Zn8kK0B.png
    Ответ написан
  • У блока меню плывет верстка, как исправить?

    batareika
    @batareika
    У вас высота блока больше, чем фоновое изображение. Пропишите белый background-color для .dropdown_nav, например.
    И рамку можно через css нарисовать. И фон градиентом через css залить
    Ответ написан
  • Куда уйти с PHP?

    KOLANICH
    @KOLANICH
    Знаю JS, PHP, C++, C#
    Но одно но - постоянные срачи.

    Вы из-за какого-то быдла собираетесь сменить ЯП?
    PHP отлично подходит для своей ниши - странице-ориентированный вебдев.
    Не fastcgi, не вебсокет-сервер, а именно "отдал документ и умер".
    Для остального нужны другие технологии, например node.js или вовсе nginx с модулем на си.
    Ответ написан
  • Куда уйти с PHP?

    miraage
    @miraage
    На PHP можно спокойно зарабатывать более 15 франклинов в месяц.
    И это отличный язык, со своими плюсами и минусами. Видимо, Вы его не так хорошо знаете, раз ищете альтернативу.
    Ответ написан
  • Улучшается ли индексация сайта, если пользоваться веб-инструментами поисковиков?

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

    maxaon
    @maxaon
    Может у клиента время неправильное? Или таймзона?
    Попробуйте время жизни поставить больше. Или сами сравните время с сервером при помощи JS.

    А может вы напоролись на баг. Их там несколько, связанных с установкой кук и редиректом. Ищите в google
    stackoverflow.com/questions/1144894/safari-doesnt-...
    stackoverflow.com/questions/612034/how-can-i-set-a...
    Ответ написан
  • Можно ли определить, по каким ключевым фразам пришел на сайт посетитель?

    alekciy
    @alekciy
    Вёбных дел мастер
    Если он пришел с поисковика, то узнать требуемое можно только у самого поисковика. И HTTP_REFFERER тут не поможет, т.к. там будет редирект от поисковика с кучей служебной информации.

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

    evnuh
    @evnuh
    Поиск Гугл помог мне, впусти и ты его в свой дом
    MySQL - реляционная СУБД. А это значит, что данные представлены в виде таблиц, и результат тоже. Вы же хотите дерево. Неа.
    Ответ написан
  • MySQL не справляется с нагрузкой от веб-приложения, нужны логи для дальнейшего разбора

    Nastradamus
    @Nastradamus
    У меня для таких целей был скриптик, работающий в фоне: раз в 5 секунд считает количество активных тредов MySQL, и если кол-во запросов больше N, то он дампит исполняющиеся запросы в лог-файл.

    Именно таким способом были выявлены основные блокирующие запросы.

    Для FreeBSD, запускался через screen:

    #!/bin/sh
    
    HOSTNAME=`hostname -s`
    DIR="/var/log/mlog.$HOSTNAME"
    pass='testpass'
    
    while :
    do
        threads=`mysql -uroot -p$pass -B -e "show status"|grep ^Threads_running|cut -f 2`
    
    # если тредов больше 60, пишем в лог:
        if [ "$threads" -gt 60 ] ; then
            {
                mysqladmin -uroot -p$pass processlist --verbose |grep -v Sleep|sed 's|                   ||g'
                iostat -dNx 2 2            
            } |gzip > "$DIR/`date "+%Y-%m-%d_%H:%M:%S"`.list.gz"
        fi
        sleep 5
    done
    
    
    
    Ответ написан
  • Чем грозит фрилансеру получение денег на paypal и вывод на российский счет?

    @Ronnie83
    Никаких последствий не будет. Имеет значение не валюта, а размер перевода в рублевом эквиваленте. Если в районе 600 000 руб, то банки обязаны сообщать о нем в Росфинмониторинг. Если суммы меньше, то переживать не стоит.
    Ответ написан
  • Какой движок интернет-магазина наиболее производительный?

    Lopar
    @Lopar
    системный администратор
    Используем Opencart в крупноопте. Пробовали Simpla, но пришли к выводу, что её сложнее пилить под себя. От Битрикса отказались сразу.
    Ответ написан
  • Архивирование по размеру [ошибка]

    AgentSIB
    @AgentSIB
    Если файлов много, то попробуйте так.
    tar cf archive.tar --files-from /dev/null
    find docs/ -size -100k -exec tar rf archive.tar {} \;
    gzip -9 archive.tar
    
    Ответ написан
  • Архивирование по размеру [ошибка]

    AterCattus
    @AterCattus
    Люблю быстрый backend
    «fork: Cannot allocate memory» это уже нехватка памяти, чтобы просто новый процесс запустить, а не найти/запаковать. Вы проверяли свободную оперативку ДО выполнения этих команд?
    Ответ написан
  • Как заархивировать все кроме картинок?

    vvpoloskin
    @vvpoloskin
    Инженер связи
    find. -not \( -name '*.jpg' -o -name '*.png' -o -name '*.gif'\) | xargs tar -czvf archive.tar.gz
    Ответ написан