PHP 페이지에 대한 직접 액세스 금지
사용자가 Ajax 호출 전용 페이지에 직접 액세스하지 못하도록 하려면 어떻게 해야 합니까?
Ajax 호출 중에 키를 전달하는 것은 해결책처럼 보이지만 키가 없는 액세스는 처리되지 않습니다.하지만 열쇠를 만드는 것도 쉽죠?뷰 소스의 저주...
p/s: Apache를 웹 서버로 사용합니다.
편집: 이유를 설명하기 위해 index.php에 jQueryui-tabs가 있으며, 이 탭 안에는 스크립트가 포함된 양식이 있습니다. 이 양식은 직접 액세스하면 작동하지 않습니다.사용자가 이 작업을 수행하려는 이유는 잘 모르겠습니다. 검증 스크립트 없이 양식에 직접 액세스할 수 없도록 함으로써 보다 사용자 친화적인 작업을 수행할 수 있을 것입니다.
그들이 AJAX를 통해 그것에 접속하고 있다는 것을 보장할 방법이 없습니다.직접 액세스와 AJAX 액세스 모두 클라이언트에서 제공되므로 쉽게 위조할 수 있습니다.
그런데 왜 이렇게 하려고 합니까?
만약 PHP 코드가 매우 안전하지 않기 때문이라면, PHP 코드를 더 안전하게 만드십시오. (예를 들어, AJAX가 사용자 ID를 PHP 파일에 전달했다면, PHP 파일에 코드를 작성하여 올바른 사용자 ID인지 확인하십시오.)
다른 사람들이 말했듯이, Ajax 요청은 적절한 헤더를 만들기 위해 에뮬레이트될 수 있습니다.요청이 Ajax 요청인지 여부를 확인하기 위해 기본적으로 확인하려면 다음을 사용할 수 있습니다.
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
//Request identified as ajax request
}
그러나 이 검사를 기반으로 보안을 설정해서는 안 됩니다.필요한 경우 페이지에 직접 액세스할 필요가 없습니다.
당신이 일을 잘못 진행하고 있는 것처럼 들리네요.AJAX 호출은 표준 페이지 요청과 같습니다. 규칙적으로만 응답은 사용자에게 표시되지 않습니다.
그러나 이는 여전히 클라이언트 요청이므로 클라이언트가 응답을 볼 수 있기 때문에 만족해야 합니다.이런 식으로 "키"를 사용하여 액세스를 난독화하는 것은 상황을 복잡하게 만들 뿐입니다.
저는 사실 뷰 소스의 "저주"는 무명을 통한 보안과의 싸움에서 작은 무기라고 말하고 싶습니다.
그래서 이것을 하고 싶은 이유가 무엇입니까?
브라우저가 일반 요청 또는 Ajax를 통해 페이지를 호출할 경우, 다른 사용자가 수동으로 호출할 수 있습니다.서버-클라이언트 통신에 관한 한 일반적인 요청과 Ajax 요청 사이에는 명확한 차이가 없습니다.
일반적인 경우 "이 요청은 Ajax에서 수행했습니다"라는 헤더를 서버에 전달합니다.프로토타입을 사용하는 경우, 자동으로 "X-Requested-With"라는 http 헤더를 "XMLHTTPRequest"로 설정하고 프로토타입 버전을 포함한 일부 다른 헤더도 설정합니다.(http://www.prototypejs.org/api/ajax/options 에서 "request"를 참조하십시오.머리글" )
추가: 다른 AJAX 라이브러리를 사용하는 경우에는 자신의 헤더를 추가할 수 있습니다.이 기능은 서버 측에서 요청 유형을 파악하고 브라우저에서 Ajax 페이지를 요청하는 단순한 경우를 방지하는 데 유용합니다.할 수 없기 때문에 모든 사람으로부터 요청을 보호하지는 않습니다.
쿠키가 안전하지 않습니다...$_SESSION을 시도합니다.이것은 여러분이 실제로 페이지를 넘기지 못하는 몇 안 되는 것들 중 하나입니다.왜냐하면, 물론, 그것은 근본적으로 여러분의 통제를 떠나지 않기 때문입니다.
감사합니다, 비록 제가 사용하지만요.
define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
if(IS_AJAX) {
//Request identified as ajax request
}
건배!
확실하지는 않지만, 레퍼러 헤더를 확인할 수 있습니까?누군가가 당신의 URL을 수동으로 입력했다면, AJAX 호출이 (적어도 방금 내 시스템에서 한 빠른 테스트에서) 레퍼러 헤더가 없을 것이라고 생각합니다.
하지만 그것은 확인하는 나쁜 방법입니다.레퍼러는 여러 가지 이유로 공백이 될 수 있습니다.당신은 사람들이 당신의 웹 서비스를 공공 서비스로 사용하는 것을 막으려고 합니까?
편집 의견을 읽은 후 Ajax 호출을 통해 양식을 로드할 경우 window.location을 확인하여 URL이 Ajax 양식의 URL인지 확인할 수 있습니다. URL이 Ajax 양식의 URL이라면 document.location을 통해 오른쪽 페이지로 이동합니다.
이것은 확실히 무언가를 확보하는 데 유용하지 않습니다.하지만 나는 만약 당신이 php 페이지 전체를 생성하는 페이지가 아약스에 의해 요청되지 않고 아약스가 사용될 때 필요한 부분만 생성한다고 말하고 싶다면 이것이 유용할 수 있다고 생각합니다.이를 통해 사이트를 Ajax 친화적이지 않게 만들 수 있으므로 링크를 클릭하면 주석 상자를 로드해야 하지만 Ajax가 없으면 주석이 표시된 전체 페이지로 전송됩니다.
index.php를 통해 직접 요청을 전달하고 agax.php를 통해 agax 요청을 전달한 다음 사용자가 직접 다른 소스 파일을 찾지 못하도록 합니다. index.php와 agax.php가 필요한 코드를 포함할 수 있는 적절한 논리를 가지고 있는지 확인하십시오.
스크립트를 호출하는 Javascript 파일:
var url = "http://website.com/ajax.php?say=hello+world";
xmlHttp.open("GET", url, true);
xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
그런 다음 php 파일 agax.dll:
if($_SERVER['HTTP_X_REQUESTED_WITH'] != "XMLHttpRequest") {
header("Location: http://website.com");
die();
}
Geeks는 여전히 헤더를 위조하여 agax.php 스크립트를 호출할 수 있지만 나머지 스크립트에는 세션이 필요하므로 유효한 세션이 감지되지 않을 때 실행이 종료됩니다.Hybrid Auth 세션이 만료된 사용자를 메인 사이트로 리디렉션하기 위해 이 작업이 필요했습니다. 사용자가 Ajax 스크립트로 리디렉션되었기 때문에 다시 로그인하기 위해서입니다.
언급URL : https://stackoverflow.com/questions/185483/prevent-direct-access-to-a-php-page
'programing' 카테고리의 다른 글
SQL Server: OLE DB 공급자 "Microsoft"의 데이터 원본 개체를 초기화할 수 없습니다.연결된 서버용 ACE.OLEDB.12.0"(null) (0) | 2023.08.28 |
---|---|
Spring 주석 @AutoWired는 어떻게 작동합니까? (0) | 2023.08.28 |
Spring IDE 플러그인이 있는 Eclipse와 Spring Tool Suite의 차이점은 무엇입니까? (0) | 2023.08.28 |
jQuery 아약스 업로드(진행 표시줄 포함) - 플래시 없음 (0) | 2023.08.28 |
명령줄을 사용하여 Mysql에서 압축된 파일 가져오기 (0) | 2023.08.28 |