2010-02-12 3 views
6

램프 설정이 있으며 로그인 한 사용자 만 액세스 할 수 있도록 웹 페이지 (이미지, CSS, 비디오 등)의 내용을 보호 할 수 있기를 원합니다.PHP를 사용하여 로그인 한 사용자에게 콘텐츠 액세스 제한

.htaccess로이 작업을 쉽게 수행 할 수 있음을 알았습니다. 그러나 인증 팝업을 사용하고 싶지 않아 세션을 사용할 수 있고 로그 아웃 할 수 있기를 원합니다.

저는 PHP를 사용하여 mysql으로 인증하고 세션을 생성하는 작업을하고 있습니다. 이것은 잘 작동합니다. 그러나 심상, CSS, javascript etc.는 아직도 접근 가능하다.

유효한 PHP 세션이있는 경우에만 어떻게 콘텐츠에 액세스 할 수 있습니까?

mod_rewrite를 사용하여 파일을 php 파일 (예 : auth.php? file = ...)로 전달하고 거기에서 세션 검사를 수행했습니다. 이것은 이미 점검 된 페이지의 모든 단일 이미지에 대해 세션을 확인하는 것이 비효율적 인 것처럼 보입니다. 그것은 해킹처럼 보이고 이것을 수행하는 더 깨끗한 방법이 있다고 생각하고 있습니다.

mod_session_cookie와 같은 아파치 모듈은 세션 키가있는 쿠키가 내 세션 데이터베이스에 존재하는지 확인하고, 그렇다면 디렉토리에 대해 모두 허용을 설정합니까?

또는 mod_auth_mysql을 사용할 수도 있지만 세션을 사용하고 인증 팝업이 아닌 PHP 양식을 사용하여 로그인 할 수 있습니까?

편집 : (.htaccess로하지 않음) 내 아파치 설정 파일에서

내가 추가 :

RewriteLock /var/www/lib/rewrite.lock 

<VirtualHost> 
    #... 
    RewriteEngine on 
    RewriteMap sessionValid prg:/var/www/lib/allow.php 

    <Directory /var/www/client/*> 
      RewriteEngine on 

      RewriteCond %{HTTP_COOKIE} !client-cookie=([^;]+) 
      RewriteRule .* - [L,R=403] 

      RewriteCond %{HTTP_COOKIE} client-cookie=([^;]+) 
      RewriteCond ${sessionValid:%1} !valid 
      RewriteRule .* - [L,R=403] 
    </Directory> 
</VirtualHost> 

그리고 스크립트 허용 여기

이 문제에 대한 나의 해결책이다 .php :

#!/usr/bin/php5 
<?php 
set_time_limit(0); 

echo ""; 
$stdin = fopen("php://stdin","r"); 
$db = mysql_connect(...); 
mysql_select_db(..., $db); 
$querypre = "SELECT ID FROM Sessions WHERE ID='"; 

while (1) { 
    $line = trim(fgets($stdin)); 

    $query = $querypre.mysql_real_escape_string($line)."'"; 
    $result = mysql_query($query); 

    if (mysql_num_rows($result) > 0) 
    echo("valid\n"); 
    else 
    echo("0\n"); 
} 

mysql_close($db); 
?> 

이것은 매력처럼 작동합니다. 이것과 session_set_save_handler을 사용하면 mysql이 지원하는 PHP 세션을 사용하여 PHP 페이지와 모든 컨텐츠를 보호 할 수있었습니다. 누군가가 이것을 유용하게 찾길 바랍니다.

몇 가지주의 사항 : 해당 가상 호스트 내부에 사용하려는 경우

  • 한다 RewriteMap 문 필요는 가상 호스트 블록 내부 정의합니다. 블록 외부에 배치하면 작동하지 않습니다.
  • RewriteMap을 정의하기 전에 RewriteEngine을 설정해야합니다. 그렇지 않으면 무시됩니다.
  • RewriteLock은 가상 호스트 블록에있을 수 없습니다.
  • 셸 스크립트와 마찬가지로 php 파일은 apache 사용자가 실행할 수 있어야하며^M의 공백은
  • 입니다. RewriteMap 문은 .htaccess에는 배치 할 수 없지만 맵을 사용하는 다른 명령문은 배치 할 수 있습니다.

답변

5
RewriteCond %{HTTP_COOKIE} !mysessioncookie=([^;]+) 
RewriteRule .+\.(jpg|css|js) forbidden.html [R=403] 
+1

Apache-fu에 올라 있지 않은 것에 대해 용서해주십시오. 쿠키 존재 여부를 확인하는 것 이상입니다. –

+0

@Brock : N ope. –

+1

그러면 우회 할 수 없을 정도로 믿을 수 없을까요? OP는 쿠키가 자신의 DB에서 적절한 세션에 대해 검증되기를 원합니다. –

0

리소스에 직접 연결하는 대신 컨트롤러의 형식을 사용하여 이미지를 제공하십시오.

예를 들어, 'images/bob.jpg '는 실제로 자원을 가리 키지 않지만 로그인을 검사하고 성공할 경우 올바른 데이터가있는 image/jpeg 헤더를 보냅니다.

+0

그는 그의 반응에서이 기술을 사용합니다. 그는 모든 단일 콘텐츠에 대해 스크립트를 실행할 필요가없는 대안이 있는지 묻습니다. –

0

저는 실제로 Apache를 사용하지 않습니다. lighttpd를 사용합니다.이 플러그인은 올바른 해시가 URI에 전달되면 폴더에 대한 액세스를 제한하는 데 사용할 수있는 플러그인을 포함합니다. 기본적으로 애플리케이션 로직과 웹 서버는 현재 시간을 가진 해시를 생성하는 데 사용되는 비밀 소금을 공유하며 해시와 함께 전달됩니다. 시간이 지난 5 분 이내이면 액세스 권한이 부여됩니다. 그렇지 않은 경우 또는 해시가 유효하지 않으면 유효하지 않습니다. 나는 아파치에 비슷한 플러그인이 있는지를 살펴볼 것이다.

편집 : mod_auth_token은 Apache에서 동일한 작업을하는 것으로 보입니다.

+0

불행히도, 이것은 나를 위해 옵션이 아닌 URL을 변경해야하는 것 같습니다. – Luke

관련 문제