Pro PHP Security

CoverКнигата се опитва да опише всички основни концепции, които е нужно да разбираме до поне някаква степен, за да се подсигурим, до колкото е възможно (тъй като се твърди, че абсолютната безопасност е близка до невъзможното), че личните данни ще останат лични, че ще избегнем излишно изразходване на ресурси и че не злоупотребяваме с хората/машините които ползват нашите услуги. Oбхващат се много важни и интересни теми като валидиране на потребителски данни, SQL инжекции, Cross-Site скриптинг, Remote execution, кражба на сесия и обезопасяване на мрежови връзки (SSL, SSH), които смятам, че са задължителни знания за всеки програмист, който работи с уеб приложения.


Типове уязвимости:

  • Когато се взема информация от потребители
    • Човешки атаки
      • Злоупотреба със съхранение
      • Използването на нашето приложение, за да се вреди на други хора или организации
      • Всяко приложение, което позволява потребителско гласуване или обратна връзка е уязвимо за Sock Puppet атаки
      • Griefers, Trolls and Pranksters
    • Автоматизирани атаки
      • Червеи и вируси (при които единствената разлика е, че вирусът трябва да е прикрепен към файл)
      • Спам
      • Автоматизирани потребителски входни данни
  • Когато се дава информация на потребители
    • Harvesting e-mail addresses
    • Flooding e-mail addresses
    • Screen scraping
    • Improper archiving
  • Други
    • Denial of service атаки
    • DNS атаки

Навици за максимална сигурност:

  • Нищо не е подсигурено на 100%, трябва просто винаги да се покриват възможно най-много бази
  • Никога не вярвай на потребителските входни данни
  • Винаги предпочитай повече наслоени защити пред една много здрава защита
  • По-простото приложение се защитава много по-лесно
  • Peer review

II. Валидация и верификация на потребителски входни данни

– Вход на данни в невалиден формат може да счупи приложението, да запише грешни данни в базата или дори да ги изтрие, може да задейства уязвимости в други библиотеки или приложения, с които работи нашето приложение или просто да предизвика неочакван резултат.

Пазете се от:

  • Поле, съдържащо мета-символи
  • Прекалено големи по обем входни данни
  • Злоупотреба със скрити елементи
  • Входни данни, съдържащи непредвидени команди

Стратегии за валидиране на входни данни:

  • Изключване на глобалните променливи
  • Деклариране на променливи
  • Позволяване единствено на очаквани входни данни
  • Подсигуряване на типа, дължината и формата на входните данни
  • Валидиране на стойности подавани към други системи
    • Мета-символи
      • Escape by prepending with “\”
      • Поставяне на кавички
      • Шифроване
    • Файлови пътища, имена и URI-та
      • стрингове, съдържащи имена на файлове са ограничени от файловата система по различни начини от другите стрингове
    • Емайл адреси
    • HTTP header стойности
      • Всякакви входни данни в Location: пренасочване, трябва да се шифроват с urlencode()
    • Заявки към бази
      • Escaping
    • HTML output
      • Използвай htmlentities() или htmlspecialchars() за PHP стойности в страниците
    • Shell аргументи
      • Потребителите никога не трябва да виждат PHP грешки

III. Предотвратяване на SQL инжекция

– Mогат да се използват външни решения като PearDB

Типове входни данни:

  • Текстово поле във форма
  • URI стойност

Стратегии:

  • Използване на intval() за целочислени входни данни или подобна функция за числа
  • Escape-ване на всички входни данни които не са числа

IV. Предотвратяване на Cross-Site Scripting

Видове:

  • Външен сайт към сайта на приложението
    • Извиква се отвън или от емайл, или от друг сайт.
    • Потребителят е залъган да кликне на линк, да зареди картинка, или да submit-не форма.
  • От сайта на приложението до външен сайт или до себе си
    • Извиква се локално, възползвайки се от доверието на потребителите в приложението.
    • Нападателят закрепя товар към коментар или друг стринг, който запазва входните данни в приложението.

Техники:

  • HTML & CSS Mark-up атаки
    • Вкарването на HTML & CSS съдържание в HTML-а, чрез закрепване към коментар или някоя друга анотация, която се post-ва в сайта на приложението.
  • JS атаки
    • Блог от JavaScript скрипт вкаран в HMLT-a на страницата.
  • Фалшифицирани action URI-та
    • Ако приложението позволява важни действия да работят само по GET, то е уязвимо
  • Фалшифицирани image source URI-та
    • Използва фалшифицирана картинка или source атрибута на елемента. За да залъже потребителя да изпълни някакво действие в приложението, без неговото намерение
  • Допълнителен товар на форма
  • Други
    • Възникват от употребата на Java аплети, actionscript филми и игри или разширения за браузър

Стратегии:

  • Ефективното предотвратяване започва в началото, когато се замисля интерфейса, не в последните стадии
  • Използване поток на работа да постави лимити, за всяка дадена страница, над това колко заявки са очаквани да последват, и да се отхвърлят заявки, които не идват от правилно място или пропускат важни потвърдителни стъпки
  • Валидиране на всички потребителски изпратени URL-ли използвайки parse_url()
  • Шифроване на HTML обекти, в полета, в които не се очаква HTML съдържание
  • Изолиране на чувствителна активност в отделни API-та
  • Предвиждане на действията на потребителя

V. Предотвратяване на външно изпълнение (Remote Execution)

– Приложения уязвими за този тип атаки са тези, които позволяват потребителски изпратени стойности да минат през eval(), или се инжектират в една от петте PHP изпълнителни функции, exec(), passthru(), proc_open(), shell_exec() and system()

Стратегии:

  • Ограничаване на позволените файлови разширения (Unix файловете нямат нужда от разширения)
  • Съхраняване на качванията отвън the web root (за да не може нападателят да изпълнява скриптове по URI)
  • Валидиране на eval(), exec(), passthru(), proc_open(), shell_exec() и system() стойности
  • Избягване на употребата на PHP скриптове от външни сървъри (или поне с използването им с hardcode-нато IP)
  • Използвай Soap, XML или RPC заявки

VI. Налагане на сигурност върху краткотрайните файлове

Стратегии:

  • Направи местоположението трудно
  • Използване на tempnam() или fopen()
  • Дефиниране на директорията на краткотрайните файлове в константа, например: define(‘TMP_DIR’, ‘/tmp’)
  • Ограничаване на правата
  • Записване само върху познати файлове (използване на checksums за проверка)
  • Проверка на качени файлове (използване на is_uploaded_file())

VII. Кражба на сесия

Методи за придобиване на сесийно ID:

  • Мрежово подслушване
  • Unwitting exposure (когато PHP позволява сесийно ID от $_GET)
  • Препращане, проксита и фишинг
  • Фиксация

Стратегии:

  • употреба на SSL
  • употреба на cookies вместо $_GET
  • употреба на сесиен таймаут
  • регенериране на сесийното ID
  • възползване от абстракцията в кода
  • избягване на неефективни решения

VIII. REST (REpresentational State Transfer) услуги

Стратегии:

  • употреба на SSL
  • лимитиране на достъп до ресурси и формати
  • Authenticating / authorising requests
  • Enforcing quotas and rate limits

IX. Използване на CAPTCHAs

– Използват се, за да предотврати роботи от влизане в приложението
– В главата се обясняват в детайли видовете CAPTCHA, има дори примери как да си създадем собствен CAPTCHA, но поради факта, че има безброй готови и безплатни решения не смятам, че би се наложило на някой

X. User authentication, authorisation and logging

– В главата се обясняват в детайли видовете автентикационни системи, системи за контрол на достъпа, и логин системи, с които един програмист може да се увери, че приложенията се използват от правилните потребители по правилния начин

XI. Предотвратяване на загуби на данни

– Шифроването на важна информация в backup-ите е изключително важно
– Backup-ите не пазят всяка версия на файла, само версията, която е съществувала във времето на записване
– Само системните администратори могат да намират и възстановяват данни от backup
– Често да се възстановят малко файлове е трудно колкото да се възстанови цялата система

Техники:

  • Заключване на записите (Record locking) и добре измислена форма за потвърждение за да се избегнат случайни грешки
  • Избягване на изтриване на данни
  • Versioning software

XII. Безопасно изпълняване на системни и външни процедурни извиквания

– В тази глава се обяснява в детайли, как да изолираме изпълнението на опасни системни команди или Remote procedure calls (RPCs)
– Изключително опасно е да се изпълняват PHP скриптове (изпълнени чрез анонимен потребител), които изпълняват sudo команди или suid библиотеки, защото тогава може да се злоупотреби с всяка уязвимост, за да се превземе целият сървър, sudo командата и други често се изтриват за лайф средата.

XIII. Обезопасяване на Unix

– Където се обяснява в детайли как да се обезопаси Unix система и докато би било нужно за всеки системен администратор да ги знае тези работи, не мисля, че би се наложило на програмист да се занимава с тях.

XIV. Обезопасяване на базата

Стратегии:

  • Никога не стартирай сървъра като root, стартирай го като обикновен непревелигирован потребител
  • Опазването на файловете с опции е изключително важно
  • Директорията на базата трябва да е достъпна само за сървърния акаунт
  • Преглеждай акаунтите на базата за опасни настройки или прекалени привилегии
  • Контролиране на достъпа до базата с grant таблици
  • Следвай consistent процес при създаване на нови акаунти на базата
  • Редовни backup-и

XV. Шифроване и хеширане

– Шифроването се използва да се предават съобщения, които трябва да се пазят в тайна, докато са в движение, а хеширането се използва за да се потвърди, че полученото съобщение е същото като изпратеното.

Шифроване

  • Симетрично
    • Двете страни споделят същия таен ключ
    • Подобни алгоритми са AES, Blowfish, и 3DES
  • Асиметрично
    • Всяка страна разполага със собствено изграден чифт ключове и алгоритъм които подсигурява, че съобщението шифровано с даден ключ (публичен), може да се разшифрова само с друг даден ключ (частен)
    • Частните ключове често имат passphrase за допълнителна защита
    • Отнема се повече изчислителна сила и е по-сложно да се имплементира
    • Подобни алгоритми са RSA и Diffie-Hellman

Хеширане

  • Теоретично е възможно две различни стойности да имат еднакви хеширани стойности
  • Подобни алгоритми са MD5 и SHA-256

Кодиране

  • Трансформира данните по схема, която е необходима за тяхното декодиране (обикновено публично разпространена)
  • Подобен алгоритъм е base64

XVI. Oбезопасяване на мрежови връзки

– SSL (Secure Sockets Layer) и неговият наследник TLS (Transport Layer Security) са известни с ролите си в обезопасяването на HTTP комуникации. Използвайки сървър, който работи с HTTPS (HyperText Transport Protocol Secure) и правилно подписан сертификат, сайта може да гарантира, че данните, които се трансферират между сървър и клиент са шифровани, не са променяни докато пристигат, и че клиентската сесия не може да се “открадне”

SSL протоколи:

  • Record протокол
    • Отговорен за записване и шифроване на всяко съобщение, вграждайки шифрованото съобщение в серии от TCP/IP пакети, сглобявайки съобщението от другия край и тогава вече го разшифрова и потвърждава
    • При начално свързване се задейства Handshake протокола
  • Handshake протокол
    • Използван, за да се договори точният метод, по който ще се извърши размяната на ключовете, шифърът които ще се използва за шифроването на следващи съобщения и тип на кода за автентикация на съобщението, който ще се използва за потвърждение на съдържанието на съобщението
    • Методът за размяна на ключовете може да е Diffie-Hellman, който не изисква сертификат, също така може да е RCA както се използва в OpenSSL среда, който изисква сертификат

SSH (Secure SHell)

  • За разлика от SSL, се използва за да се обезопасят връзки поради административни причини, като например безопасно копиране на файлове
  • Праща или към command line или от външен хост към клиентски прозорец, по начин, по който може да се взаимодейства с външния хост, все едно си там физически. It’s client suite typically includes support for command line shell, file transfer, and window forwarding capability
  • Не изисква конкретен алгоритъм за шифроване и се препоръчва използването на добре-установени алгоритми с key length 128 бита или повече
  • Изисква клиент за да се използва и най-известният е OpenSSH

XVII. Последни препоръки

  • Има прекалено много проблеми свързани с хостинга (due to scrapability of web server user id)
    • Read access to source code and supporting files
    • Access to system upload and temporary directories
    • Denial of service by CPU hogging
    • Transfer of security vulnerabilities
  • Поддържането на отделни среди за разработка и продукция
  • Постоянно обновяване на средите за да подсигуряване, за да сме сигурни, че имаме последните security patches.

Leave a Reply