2011-09-02 5 views
1

나는 ajax/PHP 스크립트를 작성하고 있으며 외부 액세스에서 아약스 파일을 보호하기 위해 스크립트의 실행을 다른 것으로 제한한다는 의미가 있습니다. 서버 (및 도메인). JQuery $ajax을 사용하여 PHP 파일에 게시합니다. PHP 스크립트의 실행을 하나의 리퍼러로 제한

<?php 
$config["url"]="mysite.com"; 
if (isset($_SERVER["HTTP_REFERER"])) { 
    $url = parse_url($_SERVER["HTTP_REFERER"]); 

    if ($url["host"] != $config["url"]) { 
     echo "You don't have access to this file."; 
     exit; 
    } else { 
     //Run The script 
    } 
} 
?> 

는 기본적으로 무엇을이 스크립트가 수행하는가 리퍼러 및 도메인과 일치한다는 것입니다 : 여기

는 PHP 파일입니다. 일치하지 않으면 스크립트가 종료되고 스크립트가 실행되면 실행됩니다. 따라서 스크립트는 mysite.com에서만 실행할 수 있으며 다른 곳에서는 실행할 수 없습니다.

나는 PHP/Javascript 전문가가 아니므로 누구나 이것이 좋은지 아닌지 그리고 어떤 조건에서 실패 할 지 알 수 있습니까?

+0

http://codereview.stackexchange.com/ –

+0

세션 사용 ... – dqhendricks

답변

0

이 스크립트가 보호하는 내용은 크로스 사이트 요청 위조 또는 CSRF입니다. 리퍼러를 확인하는 것은이 공격에 대한 두 가지 기본 방어 중 하나입니다. 여전히 실행됩니다

<img src="/src/to/your/ajax?params=something_evil" /> 

: 유일한 문제는 사이트가 사용자 생성 콘텐츠가있는 경우, 그들은 같은 무언가를 추가 할 수 있습니다. 두 번째로 가장 일반적인 예방 방법은 ajax에 CSRF 토큰을 사용하는 것입니다.

설명 : https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)

예방 : https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

편집 :

약간의 설명 것은 취소 할 수 있습니다 다음은이 공격에 대한 자세한 내용을 찾을에 읽을 수있는 두 개의 자원입니다 주제에 대한 혼란.

모든 사용자가 리퍼러 헤더를 위조 할 수 있지만 이는 부적절합니다. 문제가되지 않는 이유는 리퍼러를 위조 할 수 있다면 합법적 인 요청을 쉽게 할 수 있기 때문입니다.

여기서 중요한 부분은 다른 사용자의 요청을 위조 할 수 없도록하는 것입니다.CSRF가 CSRF 공격으로부터 보호하고 리퍼러를 확인하는 유일한 이유는 CSRF가 유일한 측면입니다.

+0

도움을 많이 주셔서 감사합니다. – Kbr89

+0

이것은 분명히 잘못되었습니다. CSRF 보호에 관해서는 거의 알지 못하지만, 제한된 지식에도 불구하고, 나는 리퍼러를 확인하는 것이 확실히 올바른 보호 수단이 아니라고 말할 것입니다. 나는 리퍼러를 위조하는 방법을 연구 해본 적이 없지만 노력하지 않고 그것을하는 법을 알고 있으므로, 다른 사람들보다 헌신적 인 결정을 내린 사용자가 원하는대로 할 수 있다고 가정하고 있습니다. 어쨌든 긴 댓글 잘라 내기 짧게,이 대답은 잘못되었습니다. – Layke

+0

+1 링크가 유용합니다. – Herbert

0

AJAX는 이미 동일한 출처 정책을 통해 브라우저 기반 보호를 제공합니다. 리퍼러 수표가 전혀 필요 없습니다.

+0

누군가 내 Jquery 아약스 스크립트를 복사 한 다음 다른 사이트에서 사용하면 PHP 스크립트가 실행되지 않습니까? – Kbr89

+0

@Thief는 맞지만 철저히 지켜 보는 데 아무런 해가되지 않습니다. 보안은 중복에 관한 것입니다. +1 "AJAX security across domains"와 같은 제목으로 변경하거나 그 영향을 줄 것을 제안 할 수 있습니까? 나는 비슷한 문제에 도움이 필요한 사람에게 더 잘 설명해 줄 것이라고 생각한다. 그냥 제안. :) – Herbert

+0

@ThiefMaster는 AJAX를 통해 요청 된 것으로 가정합니다. 하지만 당신은 여전히 ​​엔드 포인트에 서버 측 요청을 할 수 있습니다. – Yahel

0

.htaccess 파일을 사용하여 외부 호스트의 액세스를 차단할 수도 있습니다. 사람들이 당신의 아약스 페이지를로드하는 대부분의 브라우저에 내장 된 자바 스크립트 콘솔을 사용하여 다음 브라우저에서 페이지를로드 할 수 자세한 내용은 http://www.htpasswdgenerator.com/apache/htaccess.html

+0

도움을 많이 주셔서 감사합니다. – Kbr89

+0

이것은 리퍼러가 아닌 사용자의 IP를 검사합니다. 정적 인 ips를 가진 매우 제한된 사용자베이스를 사용하지 않는 한, 실제로 쓸모가 없습니다. – ThiefMaster

+0

기본적으로 모든 거부는 모든 외부 소스 및 필요한 액세스를 차단합니다. –

0

명심를 들어

<Files ~ "^\yourajaxfilename.extension"> 
Order allow,deny 
Deny from all 
</Files> 

/얻을 무엇이든 제공 후 데이터들은 필요. 리퍼러를 위조하는 다른 방법도 있습니다.

기본적으로 기술자가 아닌 사용자도 사용할 수 있지만 입력 데이터의 유효성을 검사하여 스크립트가 원치 않는 작업을 수행하지 않도록해야합니다.

+0

도움을 많이 주셔서 감사합니다. – Kbr89

관련 문제