2017-10-20 6 views
-3

두 번째 질문이 있습니다.포인트에서 Firebase 데이터베이스 보호 - 해커 추가

Firebase 데이터베이스를 기반으로 JS로 웹 사이트를 만듭니다. 내 코드 하나가 포인트 시스템을 만듭니다. 함수 "set"코드를 사용하면 획득 한 포인트 수 (기본값 0)를 포함하는 데이터베이스에 행 "포인트"가 생성됩니다. 나는 사용자가 "어떤 행동"을했을 때 그 수를 1로 늘리고 싶다. 데이터베이스 규칙에서 "포인트"의 값을 승인 된 계정에만 추가하고 가져올 수있는 행을 넣었습니다.

.. 누군가가, 나에서 코드를 복사 추가-2000-점을 코드에 추가-1 점 코드를 변경하고 단지 승인 후 붙여 넣은 경우 무슨 일이 일어날 지

. 그런 다음 그는 자신의 localhost에서 사이트를 열어 자신의 이메일을 인증하고 웹 사이트를 방문하십시오. 아니면 코드를 사용하여 브라우저 확장을 만들 수도 있습니다. 그는 2000 포인트를 더 얻겠습니까 ???

그래서, 고치는 방법, 숨기기 또는 sth. 나는 오랫동안 궁금해하고 대답을 찾을 수 없습니다. MySQL에서는 더 간단했습니다.

+0

왜 나는 아직도 사용되지 않습니다 ... 익숙해졌습니다. xD – Hubert13888

+1

(저는 downvoter가 아닙니다) downvotes를 방지하는 가장 좋은 방법은 이미 시도한 것을 보여주는 것입니다. 자신이 만든 규칙과 두려움에 처한 해커가 그러한 규칙에 어긋나는 방식을 보여줍니다. –

답변

1

거의 모든 시나리오에서 보안 규칙을 작성할 수 있습니다.

만 단위 1의 허용하려면, 간단한 기준은 다음과 같습니다

".validate": "(newData.val() === data.val() + 1) || 
       (newData.val() === data.val() - 1)" 

당신이 원하는 경우 :

".validate": "newData.val() = data.val() + 1" 

는 당신이 그 (것)들을 추가하거나 1 뺄 수 있도록하려면 1 :

"scores": { 
    "$uid": { 
    ".write": "auth.uid === $uid" 
    ".validate": "(newData.val() === data.val() + 1) || 
        (newData.val() === data.val() - 1)" 
    } 
} 

그리고 계속 켜거나 켬으로써 사용자가 자신의 점수 만 수정할 수 있도록하십시오. 필자가 본 가장 진보 된 시나리오 중 일부는 체스 게임의 동작을 검증하는 규칙이었습니다 (지금은 찾을 수 없기 때문에 Firebase 외부에 게시되었는지 확실하지 않습니다), rules for a item trading in a multiplayer game.

+0

나는 코드가 스크립트로 코드를 추가하는 것을 보호하지 않는다고 생각한다. 내가 authurised 누군가가 데이터베이스로 모든 것을 할 수 있다는 것을 의미하므로, 만약 내가 당신의 규칙을 준다면, 그는 1 점을 추가하는 스크립트를 만들 수있을 것이다 :/ – Hubert13888

+0

PHP를 사용하여 firebase에 뭔가를 추가 할 수 있습니까? 가장 안전한 방법이 될 것입니다 (저는 symfony 프레임 워크를 사용합니다). – Hubert13888

+0

https://github.com/kreait/firebase-php를 찾았지만 어디에서 google-service-account.json을 얻을 수 있는지 모르겠다. – Hubert13888

0

문제는 데이터 구조입니다. 각 사용자가 악용 될 수 있기 때문에 직접 포인트를 추가하지 못하도록하고 싶지는 않습니다. 사용자가 에게 포인트를 주었거나 포인트를 받도록 허용해야합니다. 그리고 나서 포인트가 증가해야합니다.

"pointsForObjects": { 
    "$objectId": { 
     "$uid": { 
       ".write": "auth.uid === $uid", 
       ".read": "auth.uid === $uid" 
     } 
    } 
} 

이 방법 :

{ 
    "objectsWithPoints":{ 
    "object1": { 
    "attribute": "the value", 
    "points": 2 
    } 
    "pointsForObjects":{ 
    "object1": { 
     "uid1":true, 
     "uid2": true 
    } 
    } 
} 

당신이 보안을 위해해야 ​​할 것은 단지 pointsForObjects 노드 내부에 자신의 객체를 작성하는 사용자를 허용하는 규칙을 작성하는 것입니다 : 이것은 당신의 데이터베이스 구조이어야한다 사용자가 말할 수있는 * "나는 포인트를 주거나 내가 점을 먹는다"* 데이터가 없다면 UI에 사용자가 포인트를 주도록 허락한다. 데이터가 있으면 사용자가 포인트를 내릴 수있다. .

마지막으로 포인트를 업데이트하려면 함수를 사용하여 수신기를 설정해야합니다. pointsForObjects 노드에 무엇인가가 기록되어 객체에 속한 각각의 개수가 계산되고 객체에 카운트가 설정 될 때마다.

이렇게하면 해커가 "uid: false 또는 "uid": 1을 작성하려고하면 아무런 문제가 없습니다. 이는 자녀를 세고 있기 때문에 발생합니다. 그리고 해커는 키가 동일하고 uid 일 수 있기 때문에 겹쳐 쓰기 때문에 하나 이상의 자식을 추가 할 수 없습니다.