2017-11-06 1 views
0

PHP (PDO) 및 MySQL로 작성된 간단한 연락처 데이터베이스 응용 프로그램이 있습니다. 이것은 switch case 문이있는 단일 파일입니다. 기본값은 연락처 테이블을 표시합니다. 대소 문자를 추가, 편집, 삭제 등의 기능을합니다. 모든 MySQL 문은 PDO에서 준비된 문입니다.숨겨진 필드로 매개 변수가있는 POST 또는 POST POST - 보안 및 기타

내 질문 : 이동하는 매개 변수가있는 html 링크를 사용하는 것이 더 좋으며 숨겨진 필드로 매개 변수가있는 POST 양식을 사용하는 것이 더 낫습니다.

<a href="?mode=edit&contact_id=321">edit</a> 

및 스위치의 '모드'와 $ _GET 문

의 매개 변수를 얻거나 더 나은입니다 : 각 행은 더 나은 링크를하는 것입니다 내 테이블에서 연락처 목록 가질 수 :

<form method="POST" action=""> 
    <input type="hidden" name="mode" value="edit"/> 
    <input type="hidden" name="contact_id" value="321" /> 
    <input type="submit" name="submit" value="edit" /> 
</form> 

나는 보안 관점 에서뿐만 아니라 기능 관점에 관심이 있습니다. 나는 비슷한 질문을 여기에서 찾았고 단 하나의 답을 얻은 단 하나만이 양식이 더 좋다고 말했다. 그것에는 아무런 설명도없고 4 개의 상향 조판이 없었다.

모든 정보는 크게 감사하겠습니다. 건배.

답변

1

양식과 함께 사용하는 것이 더 정확합니다. 입니다. 왜? URL 네비게이션은 GET 요청을 통해 제출되며 <form> 제출은 POST을 통해 처리됩니다. GET 요청은 exposed to the end-user 인 반면, POST 요청은 그렇지 않습니다. 이전 링크의 TeamTreeHouse에서 명시한대로 :

중요한 데이터를 처리 할 때는 POST를 사용하십시오.

이전 방식을 고려하십시오. 사용자가 브라우저에 index.php?mode=edit&contact_id=321이 표시됩니다. 악의적 인 경우에는 쉽게 상관 관계를 index.php?mode=edit&contact_id=1으로 만들 수 있습니다. 그들은 쉽게 브라우저에 입력 할 수 있습니다. 다른 인증 메커니즘을 설정하지 않았다면 go ahead 수 있으며 다른 사람의 계정을 수정할 수 있습니다.

후자는 약간입니다. 소스 코드는 노출 된 URL만큼 명확하지 않지만 누구나 여전히 볼 수 있으며 숨겨진 321 연락처를 찾을 수 있습니다. 악의적 인 사용자는 hidden 양식 필드를 편집 할 수 없다고 생각할 수도 있습니다. 그렇다고해도 쉽게 쿼리 문자열을 사용할 수 있습니다. 그들은 자신의 사본을 다운로드하여 만들 수 있으며, 단지 action 매개 변수를 자신의 것으로 대체하여 변조 된 데이터를 제출할 수 있습니다. 이에 대한 browser addons도 있습니다. 더 쉽게 만들 수 있습니다!

이 문제를 해결하려면 <form> 방법을 authentication token과 결합해야합니다. 생성 된 후에 양식이 조작되지 않도록 양식의 무결성을 확인하는 토큰을 생성하십시오.백엔드에서 토큰을 생성하는 방법에 대해 정확히 어떤 언어를 사용하는지에 따라 다르지만 JSON 웹 토큰 here에 대한 훌륭한 기사가 있습니다.

양식 제출시 토큰이 생성시의 내용과 일치하는지 확인하십시오. 일치하면 모든 것이 잘되므로 진행합니다. 그렇지 않으면 양식이 조작되었으므로 제출을 거부합니다.

자세한 내용은 Cross-Site Request Forgeries에서 OWASP's article을 확인하는 것이 좋습니다.

희망이 도움이됩니다. :)

+0

매우 유용합니다. 감사합니다. 좀 더 넓은 의미에서 생각하고 있다고 생각합니다. 나는 PDO와 prepared statement가 MySQL injection 공격으로부터 나의 코드를 보호하고 있다는 것을 알고 있으며, 나는 단지 내가 사용하고있는 폼을 사용하여 내가 알고 있지 않은 다른 익스플로잇으로부터의 공격에 대해서 공개적으로 열려 있지 않도록하고 싶다. 나는 스스로 가르치고 나의 지식은 약간 변덕 스럽다. 내 신청서는 https 사이트의 회원 증강 벽 뒤에 있습니다. – Almeister9

+0

HTTPS가 슬픈 듯이 CSRF에서 사용자를 보호하지는 않지만 인증 토큰이 양식을 보호합니다. 준비된 문장은 ** 위대한 ** 예방 조치이지만, 데이터베이스 자체에 대한 [** 최소 권한 ** 원칙] (https://en.wikipedia.org/wiki/Principle_of_least_privilege)을 추가로 선택해야합니다. 또한 WikiHow에는 실제로 PHP/MySQLi 콤보를 다루는 [** 훌륭한 기사 **] (https://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL)가 있습니다. PDO에 쉽게 적용될 수있는 ** 톤 ** 측면 –