POST 없이 Python으로 웹 사용자 인증 시스템을 구현할 수 있나요?

StackOverflow https://stackoverflow.com/questions/69979

  •  09-06-2019
  •  | 
  •  

문제

우리 대학은 POST cgi 방법을 지원하지 않습니다(나도 알아요, 미친 짓이죠). 그리고 저는 사용자가 사용자 이름과 비밀번호를 갖고 안전하게 로그인할 수 있는 시스템을 갖기를 바랐습니다.이것이 가능합니까?

그렇지 않다면 POST로 어떻게 하시겠습니까?그냥 호기심.

건배!

도움이 되었습니까?

해결책

실제로 GET 메소드를 사용하면 모든 작업을 수행할 수 있습니다.그러나 로그인에는 전체 질문 응답 프로토콜을 사용하는 것이 좋습니다.(javascript를 사용하여 클라이언트 측에서 해시할 수 있습니다.매번 고유한 챌린지를 보내면 됩니다.) 또한 문자열이 전달되는 동안 누구도 볼 수 없도록 SSL을 사용하는 것이 좋습니다.

어떤 의미에서는 GET 요청과 POST 요청 사이에 실제 보안 차이가 없습니다. 둘 다 일반 텍스트로 전달되기 때문입니다. 다른 의미에서는 실제로 그렇습니다.GET은 가로채기가 훨씬 더 쉽고 대부분의 사람들의 로그와 웹 브라우저 기록 전체에 걸쳐 있습니다.:)

(또는 다른 포스터에서 제안한 대로 HTTP 인증, 다이제스트 인증 또는 AD, LDAP, kerberos 또는 shib와 같은 더 높은 수준의 인증 체계와 같은 완전히 다른 방법을 사용하십시오.그러나 나는 POST가 없다면 이것들도 없을 것이라고 생각했습니다.)

다른 팁

지원되는 경우 HTTP 인증을 사용할 수 있습니다.

모든 방법, POST, GET 및 HTTP 인증(다이제스트 HHTP 인증 제외)이 일반 텍스트를 보내기 때문에 SSL을 추가해야 합니다.

GET은 기본적으로 POST와 같습니다. 전송할 수 있는 데이터 양에 대한 제한이 있습니다. 이는 일반적으로 POST보다 훨씬 작으며 의미론적 차이로 인해 GET은 기술적으로 둘 다인 경우에도 해당 관점에서 좋은 후보가 아닙니다. 할 수있어.

예를 들어, 무엇을 사용하고 있나요?Python에는 cgi 모듈이나 Django, CherryPy 등과 같은 일부 프레임워크와 같은 다양한 선택 사항이 있습니다.

약간의 JavaScript를 사용하면 클라이언트가 입력된 비밀번호와 서버에서 생성된 nonce를 해시하고 이를 HTTP GET에서 사용할 수 있습니다.

좋은 선택: HTTP 다이제스트 인증

잘 해내기가 더 어렵지만 옵션은 다음과 같습니다. Javascript를 사용한 클라이언트측 해싱

이 경우 Javascript가 최선의 선택입니다.

사용자 이름 및 비밀번호 요청과 함께 고유한 임의 문자열을 보냅니다.그런 다음 자바스크립트 md5 라이브러리를 사용하여 무작위 문자열과 비밀번호 [pwhash = md5(randomstring+password)]를 결합하여 해시된 비밀번호를 생성할 수 있습니다.그런 다음 자바스크립트는 호출을 인스턴스화합니다. http://SERVER/login.cgi?username=TheUsername&random=RANDOMSTRING&pwhash=0123456789abcdef0123456789abcdef

그런 다음 서버는 다음 두 가지 작업을 수행해야 합니다.이전에 임의 문자열이 사용된 적이 있는지 확인하고, 사용된 경우 요청을 거부합니다.(매우 중요 보안을 위해)

사용자 이름에 대한 일반 텍스트 비밀번호를 조회하고 md5(randomstring+password)를 수행합니다.사용자가 URL에 pwhash로 제공한 내용과 일치하면 해당 사용자라는 것을 알 수 있습니다.

이전에 무작위 문자열이 사용되었는지 확인하는 이유는 반복 공격을 막기 위해서입니다.누군가가 네트워크 트래픽이나 브라우저 기록 또는 로그를 볼 수 있다면 동일한 URL을 사용하여 다시 로그인하기만 하면 되며 원래 비밀번호를 알고 있는지 여부는 중요하지 않습니다.

또한 "Pragma:캐시 없음" 및 "캐시 제어:CGI 스크립트에서 반환된 헤더 상단에 no-cache"를 추가하여 인증된 세션이 브라우저나 ISP의 웹 캐시에 저장되지 않도록 합니다.

더욱 안전한 솔루션은 적절한 암호화와 Challenge-Response를 사용하는 것입니다.서버에 사용자 이름을 알려주면 서버는 챌린지(비밀번호로 암호화된 임의의 문자열)를 다시 보내고 서버에 임의의 문자열이 무엇인지 알려줍니다.서버에 알릴 수 있다면 분명히 귀하는 비밀번호를 가지고 있고 귀하가 누구인지 알 수 있습니다!Kerberos는 이런 방식으로 작업을 수행하지만 모든 종류의 공격을 방지하기 위해 훨씬 더 주의 깊게 수행합니다.

안전하게 로그인하는 것은 매우 주관적입니다.완전한 '보안'은 달성하기 쉽지 않습니다(가능한 경우...논쟁의 여지가 있음).그러나 가까이 다가갈 수는 있습니다.

POST가 옵션이 아닌 경우 사용 중인 시스템에 따라 .htaccess 또는 Windows 인증과 같은 디렉터리 보안 방법을 사용할 수 있습니다.

위의 두 가지 방법 모두 사용자 이름과 비밀번호를 입력할 수 있는 팝업 창을 표시합니다.

로그인 자격 증명을 보내는 방법으로 POST를 사용하려면 method="post"인 HTML 양식을 사용하고 $_POST['varname'] 방법을 사용하여 PHP 또는 ASP 페이지에서 정보를 검색하면 됩니다. PHP에서는 request.form("varname") 메서드를 사용하세요.예를 들어, PHP 또는 ASP 페이지에서 사용자 데이터베이스를 조회하여 해당 사용자 이름/비밀번호 조합이 존재하는지 확인하고, 존재하는 경우 해당 페이지로 리디렉션할 수 있습니다.

참고로 사용하세요 http://www.w3schools.com/ASP/showasp.asp?filename=demo_simpleform HTML/ASP 부분의 경우

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