문제

어떤 위한 지침을 유지할 책임 보안 세션으로 PHP?가 정보를 모든 웹을 통해 그것은 시간에 대해 그것의 모든에 착륙 한 곳!

도움이 되었습니까?

해결책

거기에 몇 가지를 유지하기 위해 보안 세션:

  1. SSL 을 사용하면 사용자 인증을 수행하거나 민감한 작업입니다.
  2. 재생성의 세션 id 때마다 보안 수준 변경(기록하는 등에서).할 수 있도 재생성의 세션 id 를 모든 요청을 원하는 경우.
  3. 는 세션 시간
  4. 를 사용하지 않 등록 globals
  5. 저장소 인증 정보를 서버에 있습니다.즉,보내지 않는 정보와 같은 사용자 이름에서 쿠키입니다.
  6. 확인 $_SERVER['HTTP_USER_AGENT'].이것은 장벽이션 납치.당신은 또한 확인할 수 있는 IP 주소가 있습니다.그러나 이 문제를 일으키는 사용자를 위한이 변화하는 IP 주소가 부하 균형을 잡는 여러 인터넷 연결을 등(는 경우에 우리의 환경을 제공하고 있습니다.).
  7. 에 대한 액세스를 제한 세션에 파일 시스템이나 사용자 세션을 처리
  8. 민감한 작업을 고려해 요구하는 사용자에 기록하여 상세정보증시

다른 팁

하나의 지침은 전화 session_regenerate_id 때마다 세션의 보안 수준을 변경합니다.이러한 문제를 방지하는 데 도움이션 납치.

내가 두개(혹은 많이)생 센트:

  • 신뢰 없
  • 필터 입력,출력을 탈출(쿠키,세션 데이터 입력도)
  • 피 XSS(유지하는 HTML 을 잘 형성되고,살펴보 PHPTALHTMLPurifier)
  • 방위 에서 깊이
  • 에 노출되지 않도 데이터

에있는 작은 그러나 좋은 책에서 이 항목: 필수 PHP 보안 크리스 시프렛.

필수적인 보안 PHP http://shiflett.org/images/essential-php-security-small.png

홈페이지에서 책을 찾을 것입니다 몇 가지 흥미로운 예제 코드와 샘플습니다.

당신이 사용할 수 있는 기술 위에서 언급(IP&UserAgent),여기서 설명: 을 방지하는 방법 identity theft

나는 생각이 하나의 중요한 문제(는 다루어지고 있는 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');

이 세션 수리지 은 매우 좋은 포인터가 공격할 수 있습니다.또한 참조 세션 수정 페이지에서 위키백과.

IP 주소를 사용하여되지 않는 정말 최고의 아이디어를 제공합니다.예를 들어,제 사무실은 두 개의 IP 주소를 얻는 사용하고 부하에 따라 그리고 우리는 지속적으로 실행으로 사용하여 문제 IP 주소가 있습니다.

대신에,나는 선택을 저장하기 위한 세션에서 별도의 데이터베이스에 대한 도메인에 서버에 있습니다.이 방법은 아무도 하나의 파일 시스템에 액세스할 수 있는 세션 정보.이 정말 도움이되었으로 phpBB 전 3.0(그 이후로 고정이)하지만 여전히 좋은 생각이 나는 생각한다.

이것은 아주 사소한 분명하지만,야 session_destroy 모든 사용 후.이 어려울 수 있습을 구현하는 경우에는 사용자가 로그인하지 않는 명시적으로,그래서 타이머 설정할 수 있습니다.

여기에는 좋 튜토리얼 에 setTimer()및 clearTimer().

의 주요 문제 PHP 션 및 보안(외에 세션 납치)제공으로 어떤 환경에 있다.기본적으로 PHP 저장에 세션 데이터 파일에서는 OS temp 디렉토리에 있습니다.없이 특별한 생각이나 계획이 세계로 읽을 수 있는 디렉토리의 모든 당신의 세션 정보를 공개하는 사람과 함께 서버에 액세스할 수 있습니다.

으로 유지를 위한 세션을 통해 여러 서버에 있습니다.그 시점에서 더 나은 것을위치 PHP 하는 사용자 세션을 처리는 그것을 당신의 통화 기능을 제공하는 CRUD(을 만들고,읽고,업데이트하고,삭제)회 데이터입니다.해당 지점에서 저장할 수 있습 세션 정보를 데이터베이스에서 또는 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();     
}

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq 아파치 헤더를 추가:

X-XSS-Protection    1

나는 모두 확인 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 거나 사용하는 시스템 환경 변수가 제대로 설정()당신은 당신을 찾을 수 있습니다 세션을 설정합니다._session.save_path_ 알려 그들이 어디에 저장됩니다.

체크의 권한 폴더의 부모입니다.하지 않아야 공용(/tmp)또는 액세스할 수 있는 다른 웹사이트에 공유 서버입니다.

가정 당신은 아직도 사용하고 싶 php 세션에 설정할 수 있습니다 php 을 사용하는 기타 폴더 변경하여 _session.save_path_ 또는 데이터를 저장하는 데이터베이스에 변경하여 _session.save_handler_.

수도 있습을 설정할 수 있 _session.save_path_in php.ini(일부 공급자는 그것을 허용)또는 아파치를 위해+mod_php 를,을 지지 않습니다.htaccess 파일에서 당신의 사이트의 루트 폴더:php_value session.save_path "/home/example.com/html/session".을 설정할 수도 있습니다 그것에 실시간으로 _session_save_path()_.

체크 크리스 시프렛의 튜토리얼Zend_Session_SaveHandler_DbTable 를 설정하고 대안 세션을 처리기입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top