문제

사용자가 쿼리 문자열 값이나 작업 URL 값을 변조하지 않도록 하려면 어떻게 해야 합니까?예를 들어 CommentID를 사용하는 CommentController에 댓글 삭제 작업이 있을 수 있습니다.작업 URL은 ID가 3인 댓글을 삭제하는 /Comments/Delete/3과 같습니다.

이제 누구도 댓글 3을 삭제하는 것을 원하지 않을 것입니다.일반적으로 댓글 소유자나 관리자에게 해당 권한이 있습니다.저는 이 보안이 다양한 방식으로 시행되는 것을 보았고 여러분 중 일부는 이를 어떻게 수행하는지 알고 싶습니다.

댓글을 검색하고 댓글 작성자가 삭제 작업을 호출하는 사용자와 일치하는지 확인하기 위해 데이터베이스를 여러 번 호출합니까?

대신에 CommentID와 UserID를 삭제를 수행하고 UserID와 CommentID가 전달된 값과 동일한 삭제를 수행하는 저장 프로시저로 전달합니까?

쿼리 문자열 값을 암호화하는 것이 더 낫습니까?

도움이 되었습니까?

해결책

당신은 그렇지 않습니다.

특히 오늘날과 같은 시대에는 프로그래밍의 기본 규칙입니다. 사용자, 브라우저, 클라이언트 등으로부터 오는 입력은 절대 신뢰하지 않습니다.

또한 자신이 하고 있는 일을 실제로 알지 않는 한 암호화 및 보안을 직접 구현하려고 시도해서는 안 된다는 것이 프로그래밍의 기본 규칙이기도 합니다.그리고 비록 당신이 무엇을 하고 있는지 안다고 해도 당신은 tard-crackers보다 한 발 앞서 있을 뿐입니다.똑똑한 사람들은 여전히 ​​​​당신을 비웃을 것입니다.

로그인한 사용자에게 올바른 권한 집합이 있는지 확인하려면 추가 쿼리를 수행하세요.그러면 모든 사람의 삶이 훨씬 더 단순해질 것입니다.

다른 팁

쿼리 매개 변수는 사소한 프로세스이며 여기에 stackoverflow에서 httpmodule을 사용하는 방법에 대한 훌륭한 예가 있습니다.

"당신은", "당신이 할 수 없다", 또는 "쉽지 않다"는이 시대와 나이에 단순히 받아 들일 수없는 반응이 아닙니다 ...

Vyrotek : 입력 방법은 중요하지 않습니다. GET, POST, 암호화/난독 화 된 GET- 실제 차이는 없습니다. 응용 프로그램이 명령을받는 방식에 관계없이 관리 조치를 수행하려면 발행 사용자가 원하는 작업을 수행 할 수 있어야합니다. 명령이 수신 된 후 및 실행되기 전에 권한 점검이 이루어져야합니다. 그렇지 않으면 보안이 전혀 없습니다.

Stephen Walther의 기사에 설명 된 기술을 사용하는 것을 고려하십시오 팁 #46 - 보안 구멍을 생성하기 때문에 링크 삭제를 사용하지 마십시오. acceptverbs (httpverbs.delete)]를 사용합니다.

또한 아래에 표시된대로 동사 동사 속성을 사용하여 컨트롤러 작업을 삭제하는 게시물 만 허용 할 수 있습니다.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Delete(int? id)
{
    //Delete
}

그런 다음 여기에서 논의 된대로 antiforgery 토큰을 사용할 수도 있습니다.

http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

나는 펑키 한 일을 쿼리 스트링을 취하고, 압축, base64 또는 16 진수를 인코딩하여 "commentid = 4 & userid = 12345"가 "code = 1a2b23de12769"가되도록했다.

기본적으로 "모호함을 통한 보안"이지만 사이트를 해킹하려는 누군가에게 많은 노력을 기울입니다.

당신은 이것을 쉽게 할 수 없습니다.

삭제하기 위해 작업 URL을 사용한 사이트에 대한 추억이 있습니다.

그들이 인트라넷을 크롤링하기 시작할 때까지 모든 것이 좋았습니다.

OOPS, 작별 인사.

편집하고 싶지 않은 것에 대해 쿼리 스트링을 사용하지 않는 솔루션을 추천합니다.

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