2010-04-11 2 views
1

여기에 나와있는 방법/모범 사례 질문 중 한 가지가 해결되었지만 입력 한 모호한 검색어를 기반으로 한 솔루션을 찾을 수 없습니다.GET으로 DB 작업을 수행하는 빠르고 쉽고 안전한 방법

"빠르고 쉬운"이라는 질문을 시작하는 것은 몇 가지 한숨을 내 쉬우므로 아마도 사과 할 것입니다.

여기 거래가 있습니다.

나는 ADMIN이 자신의 프로필과 관련된 데이터를 입력하기 위해 전체 POST 작업을 수행 할 수있는 로그인 영역이 있습니다. 데이터 구조화 방법은 관리자의 ID와 관련하여 대부분의 테이블에서 꽤 구별되어 잘 분류되어 있습니다.

이제 저는 한 가지 유형의 데이터를 덤프하고 각 레코드에 ADMIN의 고유 ID를 할당하여이 데이터를 차별화하는 표가 있습니다. 즉, 모든 ADMIN은이 테이블에이 유형의 데이터를 기록합니다. 각 레코드가있는 ADMIN ID로 구분됩니다.

이었습니다. 쿼리 문자열이있는 링크를 클릭하여 ADMIN에서 이러한 레코드를 제거하도록 계획했습니다. 분명히 GET을 사용하고 있습니다. 분명히 쿼리 구조가 링크에 있으므로 로그인 된 모든 관리자는 URL을 악용하여 경쟁 업체의 레코드를 삭제할 수 있습니다.

안전하게 POST를 통해이 작업을 수행 할 수있는 유일한 방법입니까 아니면 암호가 포함 된 세션 정보를 통과시켜 삭제를 요청하는 ADMIN ID에 대해 유효성을 검사해야합니까?

이것은 분명히 나를 위해 훨씬 더 효과적입니다.

그들이 자동차 수리 업계에서 말했듯이 저는 일하면서 ... 일을하는 3 가지 방법이 있습니다 : 빠르고, 좋고, 싸게. 한 번에 두 명씩 만 가질 수 있습니다. 빠르고 싸다는 것은 좋지 않을 것입니다. 좋고 싼 것은 빠른 처리 시간을 가지지 않을 것입니다. 빠르고 좋은 것은 싸지 않을 것입니다. 하하

그게 ... 빠르고, 쉽고이없고 한 번에 모든 보안 결코 여기에 적용 추측)

미리 감사드립니다 ... 일반적으로

+0

어쨌든 세션을 사용하지 마십시오. 즉, 요청을 보내는 "사용자"의 admin-id가 항상 해당 스크립트에 사용 가능하지 않습니까? – VolkerK

+0

그래, Volker ... 내가 말한대로 ... 나는 세션 정보에서 사용자에 대한 유효성 검사를 수행했다. 밖에 청소기가 있는지 궁금합니다. 고맙습니다! –

+0

"두 가지 선택"참조는 나를 괴롭 히고 있습니다! XSS에 대한 경고는 –

답변

3

, 상태를 변경하는 모든 작업을 (세션 상태 또는 데이터베이스 상태)가 POST를 사용해야하는지 여부를 지정합니다. 즉, GET으로 수행 할 수있는 유일한 '안전한'SQL 조작은 SELECT입니다. 백엔드 관리자 만 사용하는 경우에도 get을 사용하면 안됩니다. 브라우저를 다시 열고 Firefox를 마지막으로 닫은 시간이 'DELETE EVERYTHING'GET-> delete 페이지에 있었음을 확인하면 모든 것이 다시 삭제됩니다.

이 주된 이유 중 하나는 사이트 간 요청 위조를 방지하는 것입니다. 즉시 기록 할 것이라고 이미지 태그가 포함 된 페이지를 개설

<img src="http://example.com/account?action=logout" /> 

와 사람 : 당신이 http://example.com/account?action=logout으로 이러한 GET 변수를했다 페이지가 있다면 예를 들어, 공격자는이 같은 사이트에 이미지를 게시 할 수 비록 그들이 관리자였다하더라도. 원시 데이터베이스를 통해 해당 데이터를 검색하고 제거하는 것은 매우 성가 시게됩니다.

POST 작업은 웹 보안 문제가있는 일반적인 규칙처럼 '거의'위조하기 쉽지만 속도와 단순성, 보안 성은 절충안이므로 하나 또는 둘 중 하나를 선택해야합니다. 다른.

+0

+1입니다. 하지만 여전히 삭제할 수있는 항목에 대한 규칙을 시행하는 실제 비즈니스 로직이 필요합니다. 다른 사람들의 기록을 삭제하지 못하도록 POST에 의존하는 것은 어리석은 일입니다. – timdev

+0

감사합니다. Byron. 전체적으로 우수한 팁. 감사합니다. 선행에 대한 해답 나는 당신에게 대답을하고 있습니다. Tim 's는 큰 충고도했다! –

0

당신이 말하는 바 : "관리자 123이 Admin 321의 URL에 직접 액세스하여 그의 정보를 삭제하면 어떻게 될까요?" 아니요?

그렇다면 로그인 한 모든 관리자는 해당 관리자에게 고유 한 식별자가있는 세션이 하나 이상 있어야합니다. 그렇지 않다면, 그는 먼저 관리 섹션에있을 수 없어야합니다. URL의 식별자를 세션의 식별자와 비교할 수 없습니까?

관리자가 아닌 모든 사용자가 'delete me'URL에 액세스하면 세션에서 해당 데이터의 원래 '소유자'(admin)로 식별되어야합니다.

+0

안녕하세요, omfgroflmao ... 네, 그게 내가해야 할 일이라고 생각했습니다. 나는 나의 대답이 구불 구불 움직 였다는 것을 안다. 그래서 나는 그 질문에 대해 애매 모호하게 제안한 것을 보지 못해서 당신을 잘못하지 않았다. –

2

세션을 설정해야합니다.

GET을 통한 POST를 사용하면 보안과 관련하여 아무 것도 볼 수 없습니다. POST는 GET과 마찬가지로 위조 될 수 있습니다.

관리자가 로그인하면 세션에서 일종의 식별자를 사용한다고 가정합니다.

이 대략 비슷한 고려 : 그 예에서

<?PHP 
session_start(); 

if (empty ($_SESSION['admin_id'])) die("Log in, son."); 

if (empty($_GET['record_id'])) die("You've got to tell me which record to delete!"); 

if (! is_numeric($_GET['record_id'])) die("Invalid record ID"); 

//just to be totally safe, even though we just enforced that it's numeric. 
$record_id = mysql_real_escape_string($_GET['record_id'])); 

$sql = "DELETE FROM table WHERE record_id='{$record_id}' AND admin_id = {$_SESSION['admin_id']}"; 

mysql_query($sql); 

echo "Record was deleted (assuming it was yours in the first place)"; 
?> 

을, 우리는 DELETE 쿼리의 WHERE 절을 활용하여 "다른 사람의 레코드를 삭제"문제를 피할 수 있습니다. 물론, 더 사용자 친화적 인, 먼저 레코드를 가져 와서 $ _SESSION의 admin_id와 레코드의 admin_id를 비교하고, 일치하지 않으면 불평하고, 로그를 남기고, 오류를 던지기를 원할 것입니다.

HTH

+0

안녕하세요, 팀 ... 고마워요. 나. 나. 롭. 스파르타. .. 너의 조언을 고려해 볼께. 모두가 건강하기를 바라 라! !! –

+0

Bwahaha! 작은 세상. 좀 더 강렬한 도움이 필요하시면 저에게 이메일을 보내 주시기 바랍니다. – timdev

관련 문제