2016-09-28 3 views
0

각 행마다 ID가 분명히있는 테이블이 있습니다. 사용자가 테이블 행을 클릭하면 전체 데이터를 보여주는 다른 페이지로 이동합니다 (다른 페이지는 실제로로드 이벤트 이후 숨겨져 있지 않은 동일한 페이지 임).가장 쉬운 방법은 파이어 버그에서 테이블 데이터가 조작되었는지 확인하는 것입니다.

jquery로 click 이벤트를 가져온 다음 jquery load로 id를 보내면 데이터가로드됩니다.

문제는 이것입니다. 페이지를 사용하는 사람이 방화범이 걸린 사람을 설치 한 경우 그는 테이블의 ID를 조작 할 수 있으며 접근해서는 안되는 것에 액세스 할 수 있습니다.

그래서 그 사용자가 액세스 할 수있는 ID를 확인하는 함수를 작성해야했습니다.

function checkID($searchColumn,$userColumn,$tablename,$table_id,$user_id) 
{ 
    Global $db; 
    $query = "SELECT `{$userColumn}` FROM $tablename WHERE `{$searchColumn}`=?"; 
    //echo $query; 
    $stmt = $db->prepare($query); 
    $stmt->bind_param('i',$table_id); 
    $stmt->execute(); 
    $stmt->bind_result($myuser_id); 

    if($stmt->fetch()) 
    { 
     if($myuser_id==$user_id): 
      return true; 
     else: 
      return false; 
     endif; 
    } 
} 

위의 함수는 기본적으로 사용자가 해당 ID에 액세스 할 수 있는지 여부에 따라 true 또는 false를 제공합니다.

데이터가 서버 측에서 파이어 버그에서 조작되었는지 확인하는 더 좋은 방법이 있습니까?

기본적으로 ID는 서버에 보내지는 ID가 테이블에있는 것과 동일한 지, 방화 꾼이 조작하지 않았는지 확인하고자합니다. 내 기능이 작동하더라도 나는 아마도 더 간단한 해결책이 있다고 생각하고있다. 전문가들은 무엇을합니까?

+0

브라우저에는 요즘 개발자 도구가 내장되어 있으므로 사용자는 방화범을 설치하지 않아도됩니다. –

+0

동의합니다. Firebug가 그 예입니다. 저 밖에 다른 사람들이 있다는 것을 압니다.하지만 저는 파이어 폭스를 사용합니다. 그래서 방화범은 제가 아는 사람입니다. 내가 사용하는 것보다 ID를 검증하는 더 쉬운 방법을 찾고 있었고 전문가가하는 일을 묻는 중이었습니다. –

+0

두 노트 : 1. [Firebug가 사라집니다] (https://blog.getfirebug.com/2016/06/07/unifying-firebug-firefox-devtools/), 어느 시점에서 내장 된 [Firefox DevTools] (https://developer.mozilla.org/en-US/docs/Tools). 2. 나는 실제로 테이블이 어떻게 생겼는지 아직도 나에게 불분명하지만 답변을 제공했다. –

답변

1

데이터가 클라이언트 인 경우 항상의 유효성을 검사하고 서버 측에서 삭제해야합니다.

e.e. $searchColumn, $userColumn, $tablename, $table_id$user_id이 요청 변수 인 경우 각 요청의 유효성을 검사해야합니다. 특히 $userColumn, $tablename$searchColumnprepare()에 전화하기 전에 추가되므로 SQL 주입에 대해 신중하게 검사해야합니다.
유연성이 필요하지 않은 경우 문자열에 테이블 및 열 이름을 입력해야합니다.

서버 측 (세션 변수)에 사용자 ID를 유지하고 로그인시 한 번만 설정하여 검사를 완전히 제거 할 수도 있습니다. 사용자 데이터를 참조하는 테이블은 여전히 ​​사용자 ID가있는 열이 있어야합니다.

사용자가 볼 수있는 데이터에만 액세스 할 수 있도록하려면 쿼리에 사용자 ID를 포함시켜야합니다.

예 :

는 m 관계에 1 주문 및 주문 항목을 상상해보십시오. 그가 만든 명령 목록을 사용자에게 보여줍니다. 이제 사용자가 항목을 표시 할 주문을 선택하면 사용자가 다른 사용자의 주문에 액세스 할 수 없도록 사용자 ID를 쿼리에 포함 할 수 있습니다.

그런 다음 SELECT 문은 다음과 같을 수 있습니다

SELECT oi.name, 
     oi.description 
     oi.price 
FROM order_item oi 
INNER JOIN order o ON o.id = oi.order_id 
WHERE o.id = ? 
    AND o.userID = ? 

그런 다음 사용자가 다른 사용자의 주문의 ID를 제공하면, 모든 항목이 반환이되지 않습니다.

order 테이블에 대한 쿼리를 먼저 작성하여 사용자에게 주문이 지정되었는지 확인하고 주문 항목에 대해 쿼리를 작성하여 두 단계로 수행 할 수도 있습니다.

+0

내 함수가 확인하는 유일한 것은 테이블 행 ID입니다. 내 함수가 그것들을 검사 할 수 있도록 테이블 이름과 다른 모든 것을 전달해야한다. 기본적으로 내가 테이블 행을 클릭 할 때 데이터를 볼 위치를 취하고 있지만 ID를 조작했다면 볼 수없는 데이터를 볼 수 있습니다. 위생에 관해서는 항상 준비된 쿼리를 사용합니다. 내가 보여준 코드는 ID가 유효한지 확인하는 현재 함수입니다. 괜찮아요,하지만 난 더 간단한 솔루션을 찾고 있었어 –

+0

만약 그들이 id를 변경하면이 방법을 사용하여 쿼리는 어떤 데이터를 다시 가져 오지 않을 것입니다. 나는 너가 보는 이드를 찾고 있었다. 그래서 내 쿼리에서 ID와 사용자 ID를 검색해야합니다. 그런 다음 방화범이 적용된 ID를 변경하면 쿼리가 비게됩니다. 왜 이런 생각을하지 않았습니까 –

+0

정확히! 데이터가 실제로 사용자에게 할당되었는지 확인해야합니다. 나는 또한 두 개의 별도의 쿼리에서이 작업을 수행 할 수 있다는 답변을 추가로 업데이트했습니다. 테이블 간의 관계에 따라 복잡해질 수 있지만 기본적으로 데이터가 사용자에게 속하는지 여부는 항상 쿼리 할 수 ​​있습니다. 가장 간단한 대답을 보는 것이 쉽지 않은 경우가 있습니다. :-) –

관련 문제