분류 php

PHP 앱 보안을 위한 10 단계

컨텐츠 정보

  • 조회 575 (작성일 )

본문

안녕하세요 PHP 개발자. 이 게시물에서는 PHP 앱의 보안을 개선하기 위해 수행 할 수 있는 몇 가지 구체적인 단계를 시도하고 제공 할 것입니다. 저는 PHP 구성 자체에 초점을 맞추고 있으므로 SQL 주입, HTTPS 또는 기타 비 PHP 관련 문제에 대해서는 언급하지 않습니다.


docker-entrypoint.sh 스크립트의 bash 행을 사용하여 예제를 설명하지만 물론 비 Docker 환경에 적용 할 수 있습니다.


https://dev.to/elabftw/10-steps-for-securing-a-php-app-5fnp


Sessions 


더 긴 세션 ID 길이 사용 


세션 ID 길이를 늘리면 공격자가 추측하기가 더 어려워집니다 (무차별 대입 또는 부 채널 공격을 통해). 세션 ID 길이는 22 자에서 256 자 사이 일 수 있습니다. 기본값은 32입니다.


sed -i -e "s/session.sid_length = 26/session.sid_length = 42/" /etc/php7/php.ini


(Alpine Linux에서 26 인 이유는 묻지 마세요 ...)


session.sid_bits_per_character를 살펴볼 수도 있습니다.


제한적인 권한이 있는 사용자 지정 세션 저장 경로 사용 


nginx/php 만 세션에 액세스하면 되므로 제한적인 권한이 있는 특수 폴더에 넣어 보겠습니다.


sed -i -e "s:;session.save_path = \"/tmp\":session.save_path = \"/sessions\":" /etc/php7/php.ini
mkdir -p /sessions
chown nginx:nginx /sessions
chmod 700 /sessions


물론 Redis를 사용하여 세션을 처리하는 경우 이 부분은 신경 쓰지 않습니다.)


Secure session cookies 


session.cookie_httponly를 사용하여 자바 스크립트가 액세스하지 못하도록 합니다. 더 많은 정보.


sed -i -e "s/session.cookie_httponly.*/session.cookie_httponly = true/" /etc/php7/php.ini
sed -i -e "s/;session.cookie_secure.*/session.cookie_secure = true/" /etc/php7/php.ini



session.cookie_secure는 쿠키가 일반 텍스트 HTTP로 이동하는 것을 방지합니다.


session.cookie_samesite는 교차 사이트 공격을 방지합니다. 최근 PHP / 브라우저에만 해당됩니다.


엄격 모드 사용 


쿠키 사양으로 인해 공격자는 쿠키 데이터베이스 또는 JavaScript 삽입을 로컬로 설정하여 제거 할 수 없는 세션 ID 쿠키를 배치 할 수 있습니다. session.use_strict_mode는 공격자가 초기화 한 세션 ID가 사용되는 것을 방지 할 수 있습니다.


수명 제한 


세션은 브라우저와 함께 닫혀야 합니다. 따라서 session.cookie_lifetime을 0으로 설정하십시오.


Open_basedir 


open_basedir는 PHP가 접근 할 수 있는 파일 / 디렉토리를 제한 할 수 있는 php.ini 설정 옵션입니다.


sed -i -e "s#;open_basedir =#open_basedir = /elabftw/:/tmp/:/usr/bin/unzip#" /etc/php7/php.ini


여기에 작곡가가 사용하는 압축 풀기를 추가했습니다. /elabftw는 모든 소스 PHP 파일이 있는 곳입니다. 그리고 나는 /tmp가 왜 여기에 있는지 기억하지 못하지만 분명히 이유가 있습니다.


함수 비활성화 


앱을 매우 쉽게 엉망으로 만들 수 있으므로 주의하십시오. 그러나 이것은 확실히 조사해야 할 것입니다. 공격자가 웹셸을 올바로 업로드 한 상태에서 웹셸이 실제로 shell_exec로 작동하지 않고 친구가 비활성화 된다고 가정 해 보겠습니다. elabftw에서 작동하는 목록을 제공하고 있지만 100 % 완전하지는 않습니다.


sed -i -e "s/disable_functions =/disable_functions = php_uname, getmyuid, getmypid, passthru, leak, listen, diskfreespace, tmpfile, link, ignore_user_abort, shell_exec, dl, system, highlight_file, source, show_source, fpaththru, virtual, posix_ctermid, posix_getcwd, posix_getegid, posix_geteuid, posix_getgid, posix_getgrgid, posix_getgrnam, posix_getgroups, posix_getlogin, posix_getpgid, posix_getpgrp, posix_getpid, posix_getppid, posix_getpwnam, posix_getpwuid, posix_getrlimit, posix_getsid, posix_getuid, posix_isatty, posix_kill, posix_mkfifo, posix_setegid, posix_seteuid, posix_setgid, posix_setpgid, posix_setsid, posix_setuid, posix_times, posix_ttyname, posix_uname, phpinfo/" /etc/php7/php.ini



url_fopen 비활성화 


allow_url_fopen 옵션은 위험합니다. 비활성화 하십시오. 여기에 더 많은 정보가 있습니다.


sed -i -e "s/allow_url_fopen = On/allow_url_fopen = Off/" /etc/php7/php.ini



cgi.fix_pathinfo 비활성화 


비 PHP 파일이 PHP 파일로 실행되는 것을 원하지 않습니까? 그런 다음 이것을 비활성화 하십시오. 더 많은 정보.


sed -i -e "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g" /etc/php7/php.ini


PHP 버전 숨기기 


끝내기 위해, 초심자 :


sed -i -e "s/expose_php = On/expose_php = Off/g" /etc/php7/php.ini


지금은 그게 다입니다. 이 게시물이 유용하고 구성을 개선하기를 바랍니다.)