Mysql
 sql >> база данни >  >> RDS >> Mysql

Ограничаване на изпълнението на PHP?

Има няколко слоя, които трябва да защитите.

Някои от хостеритенеправилно разчитайте на PHP "защити" като open_basedir, safe_mode (по-стари PHP), disable_functions и т.н.

Дори PHP НЕ ги счита за защитни функции - http://php.net/security- note.php

Те могат да бъдат деактивирани с всеки експлойт за PHP и тогава цялата система е обречена, не направи това.

Как трябва да се направи

отдолу

  • Отделен потребител на ниво ОС/система за всеки хостван сайт
  • правилни разрешения (едното не може да преглежда/редактира страницата на другото) – също така се уверете, че поддиректориите имат правилно разрешение, тъй като те ще бъдат подобни
  • отделни сесийни файлове (МНОГО уеб хостинги поставят сесийни файлове от всеки хостван PHP сайт в една и съща директория, това е лошо лошо лошо!

Apache най-накрая получи свой собствен модул за това - Apache MPM-ITK .

Накратко: Представете си това, както бихте дали на потребителя обвивка на машината (под неговия собствен uid) - той не може да направи нищо с другите хоствани сайтове.

  1. различен uid/gid
  2. системни разрешения
  3. фреймворки като SELinux, AppArmor и други подобни
  4. grsecurity, ако искате да сте хардкор.. но системата ще бъде по-трудна за поддръжка.

нагоре?

Можете да получите повече хардкор. Най-доброто, което съм виждал, е споделена библиотека за apache (или каквото и да използвате) - която се използва, когато apache се стартира с LD_PRELOAD и изпълнява всички потенциално злонамерени системни извиквания като system() , execve() и по същество всяко друго обаждане, което смятате за лошо.

Все още не съм виждал добра реализация на това там (освен някъде персонализирани) - поправете ме, ако греша.

Не забравяйте да приложите бял списък за това, като напр. mail() в PHP изпълнява sendmail по подразбиране и това вече няма да работи.

заключение

Добавете класически disable_functions, open_basedir и т.н. в глобалния php.ini, добавете session.save_path към всеки vhost - поставете сесиите в потребителски директории. Уверете се, че потребителите не споделят нищо .

Приложете правилно разделянето на ниво ОС.

Вземете хардкор с grsec и LD_PRELOAD lib hooking системни повиквания.

Разделяне, разделяне, разделяне .. скоро достатъчно системи като Docker ще предоставят LXC-базирани контейнери за разделяне на потребителите на ниво ядро, но все още не е напълно готово за производство (imho).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използването на LIMIT 1 ускорява ли заявка към първичен ключ?

  2. Сортирането на колона VARCHAR като FLOAT с помощта на оператора CAST не работи в MySQL

  3. MySQL аналог с дълъг текст в Microsoft SQL?

  4. Време за създаване на таблици Innodb

  5. Има ли някакъв начин автоматично да се създаде тригер при създаване на нова таблица в MySQL?