PHP 의 session 은 안전 합 니까?
session 의 원리 체제 에 대해 인터넷 에 좋 은 글 이 많이 있 으 니 우 리 는 스스로 찾 아 볼 수 있다.테스트 용 예 를 직접 공유 하 겠 습 니 다.
이 테스트 의 예 는 주로 로그 인 페이지 입 니 다.로그 인 에 성공 한 후에 비밀 번 호 를 수정 할 수 있 습 니 다.이렇게 간단 한 기능 입 니 다.
화면 은 아래 와 같다.
우선 프로젝트 입구 에 함수 session 을 사용 합 니 다.start()가 session 을 열 었 습 니 다.이렇게 하면 클 라 이언 트 가 요청 을 할 때 신분 표지 인 SessionID 가 생 긴 다.쿠키 를 통 해 클 라 이언 트 에 저 장 됩 니 다.클 라 이언 트 와 서버 의 매번 통신 은 이 SessionID 로 신분 식별 을 합 니 다.
로그 인 에 성공 하면 사용자 id,사용자 이름 을 session 에 저장 합 니 다.
$_SESSION[‘userid'] = id
$_SESSION[‘uname'] =
앞으로 모든 조작 은 판단 을 통 해$SESSION[userid]사용자 가 로그 인 했 는 지 확인 하기 위해 존재 합 니까?코드 는 다음 과 같 습 니 다:
if(isset($_SESSION['userid'])) return true;
암호 인 터 페 이 스 를 수정 하 는 호출 은 ajax 를 통 해 이 루어 집 니 다. post 방식 으로 데 이 터 를 서버 로 전송 합 니 다.
$.post(" *******",
{
oldpass:oldpass,
newpass:newpass,
userid:uid,
},
function(data){
data = eval('(' +data+ ')');
$('.grant_info').html(infos[data.info]).show();
}
);
주의 하 세 요.저 는 이 코드 를 html 페이지 에 썼 습 니 다.그래서 html 코드 를 보면 인터페이스 주 소 를 알 수 있 습 니 다.비밀 번 호 를 수정 하 는 인 터 페 이 스 는 이렇게 이 루어 집 니 다.먼저 사용자 가 로그 인 할 지 여 부 를 판단 하고 로그 인 을 해 야 비밀 번 호 를 수정 할 수 있 습 니 다.
테스트 사례 의 실현 방향 은 아마 위 에서 소개 한 것 과 같다.
Session ID 로 공격
1.먼저 SessionID 를 얻 습 니 다.물론 공격 자가 이 표 지 를 얻 는 방식 이 많 습 니 다.제 수준 이 제한 되 어 있 기 때문에 제 가 여기 서 어떻게 얻 는 지 에 대해 소개 하지 않 습 니 다.이 항목 을 정상적으로 방문 한 다음 브 라 우 저 를 통 해 SessionID 를 보고 합 법 적 인 사용자 표 지 를 얻 는 것 을 모 의 할 수 있 습 니 다.요청 헤더 에서 이 ID 를 볼 수 있 습 니 다.
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Connection: keep-alive
Cookie: Hm_lvt_bf1154ec41057869fceed66e9b3af5e7=1450428827,1450678226,1450851291,1450851486; PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7;
Host: ******
Referer: ******
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0
session ID 를 받 은 후 이 사용자 가 로그 인 에 성공 하면 서버 의 session 에 이 사용자 의 정보 가 있 습 니 다.2.SessionID 를 가 져 온 후 공격 자가 암 호 를 수정 하 는 인 터 페 이 스 를 알 고 있다 면 이 사용자 의 암 호 를 직접 수정 할 수 있 습 니 다.공격 자가 아직 인터페이스 주 소 를 얻 지 못 했다 면 페이지 코드 를 통 해 인터페이스 주 소 를 찾 을 수 있다.다음 명령 을 사용 할 수 있 습 니 다.
#curl --cookie "PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7"
위 에서 말 했 듯 이 이 예 에서 ajax 코드 는 html 페이지 에 쓰 여 있 기 때문에 이 페이지 에서 인터페이스 주 소 를 볼 수 있 습 니 다.부분 html 코드 는 다음 과 같 습 니 다.
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
……
var uid = $(".userid").val();
$.post("/User/User/modifypass_do",
{
oldpass:oldpass,
newpass:newpass,
userid:uid,
},
function(data){
data = eval('(' +data+ ')');
$('.grant_info').html(infos[data.info]).show();
}
);
……
<span><input type="password" name="oldpass" id="textfield_o" placeholder=" "></span>
<span><input type="password" name="newpass" id="textfield_n" placeholder=" "></span>
<span><input type="password" name="confirmpass" id="textfield_c" placeholder=" "></span>
<input type="button" class="btn_ok" value=" " />
3.인 터 페 이 스 를 얻 은 후 curl 시 뮬 레이 션 post 를 통 해 데 이 터 를 보 내 비밀 번 호 를 수정 할 수 있 습 니 다.명령 은 아래 와 같다.
# curl --cookie "PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7" -d oldpass=111111 -d newpass=000000 -d userid= id
이 사용자 가 로그 인 했다 면 공격 자 는 상기 명령 을 실행 하여 사용자 의 비밀 번 호 를 변경 할 수 있 습 니 다.해결 방법
상기 방식 의 공격 에 대해 우 리 는 검증 방식 을 복잡 하 게 함으로써 안전성 을 강화 할 수 있다.그 중 하 나 는 요청 헤더 에 있 는 User-agent 항목 을 이용 하여 안전성 을 강화 하 는 것 이다.
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Connection: keep-alive
Cookie: Hm_lvt_bf1154ec41057869fceed66e9b3af5e7=1450428827,1450678226,1450851291,1450851486; PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7;
Host: ******
Referer: ******
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0
프로젝트 시작 할 때 처음에 우 리 는 session 만 썼 다.start()함수 로 session 을 엽 니 다.지금 우 리 는 sessionstart()아래 에 이 코드 를 추가 합 니 다.
$_SESSION[‘User_Agent'] = md5($_SERVER[‘HTTP_USER_AGENT']);
그리고 로그 인 여 부 를 판단 할 때마다 판단 조건 을 다음 과 같이 추가 합 니 다.
If(isset($_SESSION[‘userid']) && $_SESSION[‘User_Agent'] == md5($_SERVER[‘HTTP_USER_AGENT'])){
return true;
}
이렇게 하면 상술 한 간단 한 공격 을 피 할 수 있다.요약:
물론 실제 상황 에서 의 공격 은 이렇게 간단 하지 않다.먼저 SessionID 를 얻 는 것 이 비교적 어렵다.그 다음 에 서버 와 상호작용 하 는 코드 를 최대한 암호 화하 면 상기 상황 을 피 할 수 있다.우리 가 두 번 째 로 코드 를 수정 한 후에 공격 의 복잡 도 를 증가 시 킬 수 있 고 공격 을 근절 할 수 없다.공격 방식 은 다양 하 다.여 기 는 간단 한 방식 일 뿐 하나의 사고방식 만 제공 하지만 원 리 는 같다.실제 상황 에서 실제 상황 에 따라 우리 코드 의 안전 정 도 를 강화 할 수 있다.
여 기 는 단지 자신 이 업무 중 에 부 딪 힌 문 제 를 공유 할 뿐,벽돌 을 던 져 옥 을 끌 어 올 릴 권리 가 있 으 니,여러분 들 이 더욱 깊이 공부 하 시기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.