PHP로 책임있는 세션 보안을 유지하기위한 지침은 무엇입니까? 웹 전체에 정보가 있으며 모든 정보가 한 곳에 도착한시기입니다.
PHP로 책임있는 세션 보안을 유지하기위한 지침은 무엇입니까? 웹 전체에 정보가 있으며 모든 정보가 한 곳에 도착한시기입니다.
답변:
세션을 안전하게 유지하기 위해 수행해야 할 몇 가지 작업이 있습니다.
$_SERVER['HTTP_USER_AGENT']
. 이것은 세션 하이재킹에 작은 장벽을 추가합니다. IP 주소를 확인할 수도 있습니다. 그러나 이것은 여러 인터넷 연결 등의 부하 분산으로 인해 IP 주소가 변경되는 사용자에게 문제를 일으 킵니다 (여기서는 우리 환경의 경우).한 가지 지침은 세션의 보안 수준이 변경 될 때마다 session_regenerate_id 를 호출 하는 것입니다. 세션 하이재킹을 방지하는 데 도움이됩니다.
내 두 개 이상의 센트 :
이 주제에 관한 작지만 좋은 책이 있습니다 : Chris Shiflett의 필수 PHP 보안 .
필수 PHP 보안 http://shiflett.org/images/essential-php-security-small.png
이 책의 홈 페이지에는 흥미로운 코드 예제와 샘플 장이 있습니다.
여기에 설명 된 위에서 설명한 기술 (IP 및 UserAgent)을 사용할 수 있습니다. 신원 도용 방지 방법
필자는 PHP 6에서 해결되는 주요 문제 중 하나가 register_globals라고 생각합니다. 현재 피하는 데 사용되는 표준 방법 중 하나 register_globals
는 $_REQUEST
, $_GET
또는 $_POST
배열 을 사용하는 것 입니다.
이를 수행하는 "올바른"방법 (5.2에서는 현재 약간 버그가 있지만 조만간 6에서는 안정적 임)은 필터를 통하는 것 입니다.
따라서 대신 :
$username = $_POST["username"];
당신은 할 것입니다 :
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
또는 심지어 :
$username = filter_input(INPUT_POST, 'username');
이 세션 수정 보고서 에는 공격이 올 수있는 매우 유용한 정보가 있습니다. Wikipedia의 세션 수정 페이지 도 참조하십시오 .
이것은 매우 사소하고 명백하지만 모든 사용 후에 는 session_destroy 해야 합니다. 사용자가 명시 적으로 로그 아웃하지 않으면 구현하기 어려울 수 있으므로이를 수행하도록 타이머를 설정할 수 있습니다.
다음은 setTimer () 및 clearTimer ()에 대한 유용한 자습서 입니다.
PHP 세션 및 보안 (세션 하이재킹 제외)의 주요 문제는 현재 환경에 있습니다. 기본적으로 PHP는 세션 데이터를 OS의 temp 디렉토리에 파일로 저장합니다. 특별한 생각이나 계획이 없다면 이것은 세계적으로 읽을 수있는 디렉토리이므로 모든 세션 정보는 서버에 액세스 할 수있는 모든 사람에게 공개됩니다.
여러 서버에서 세션을 유지 관리하는 경우 이 시점에서 제공된 함수를 호출하여 세션 데이터를 CRUD (생성, 읽기, 업데이트, 삭제)하는 사용자 처리 세션으로 PHP를 전환하는 것이 좋습니다. 이 시점에서 모든 응용 프로그램 서버가 데이터에 액세스 할 수 있도록 세션 정보를 데이터베이스 나 memcache 솔루션에 저장할 수 있습니다.
공유 서버에있는 경우 자신의 세션을 저장하면 파일 시스템보다 자주 제어 할 수있는 데이터베이스에 세션을 저장할 수 있기 때문에 유리할 수도 있습니다.
세션을 다음과 같이 설정했습니다.
로그인 페이지에서 :
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);
(구성 페이지에 정의 된 문구)
그런 다음 나머지 사이트 전체에있는 헤더에서
session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {
session_destroy();
header('Location: http://website login page/');
exit();
}
session.cookie_httponly = 1
change session name from default PHPSESSID
X-XSS-Protection 1
X-XSS-Protection
모든 정말 유용하지 않습니다. 실제로 보호 알고리즘 자체가 실제로 악용되어 이전보다 더 나빠질 수 있습니다.
IP와 사용자 에이전트가 모두 변경되는지 확인합니다.
if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
|| $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
//Something fishy is going on here?
}
session_set_save_handler () 를 사용하는 경우 고유 한 세션 처리기를 설정할 수 있습니다. 예를 들어, 세션을 데이터베이스에 저장할 수 있습니다. 데이터베이스 세션 핸들러의 예제는 php.net 주석을 참조하십시오.
서버가 여러 개인 경우 DB 세션도 좋습니다. 그렇지 않으면 파일 기반 세션을 사용하는 경우 각 웹 서버가 동일한 파일 시스템에 액세스하여 세션을 읽고 쓸 수 있는지 확인해야합니다.
세션 데이터가 안전한지 확인해야합니다. php.ini를 보거나 phpinfo ()를 사용하면 세션 설정을 찾을 수 있습니다. _session.save_path_는 저장 위치를 알려줍니다.
폴더 및 상위 폴더의 권한을 확인하십시오. 공개 서버 (/ tmp)이거나 공유 서버의 다른 웹 사이트에서 액세스 할 수 없습니다.
여전히 PHP 세션을 사용한다고 가정하면 _session.save_path_를 변경하여 다른 폴더를 사용하거나 _session.save_handler_를 변경하여 데이터베이스에 데이터를 저장하도록 php를 설정할 수 있습니다.
php.ini (일부 공급자는 허용) 또는 apache + mod_php, 사이트 루트 폴더의 .htaccess 파일에서 _session.save_path_를 설정할 수 있습니다.
php_value session.save_path "/home/example.com/html/session"
. _session_save_path () _를 사용하여 런타임에 설정할 수도 있습니다.
Chris Shiflett의 자습서 또는 Zend_Session_SaveHandler_DbTable 을 확인 하여 대체 세션 핸들러를 설정하십시오.