2010-02-19 3 views
3

누군가가 레코드에 액세스 할 수 있는지 항상 확인하지만 일반적으로 쿼리 문자열에서 UID를 사용합니다. "id = 1,? id = 2는 유혹을 피하려고합니다.UID를 사용하는 대신 Primary Key를 암호화/해독 하시겠습니까?

비록 레코드 ID 대신 UID를 저장해야하므로 여러 테이블에서 조회를 수행하는 것이 다소 복잡해집니다.

ID 문자열의 암호화 된 문자열을 쿼리 문자열로 전달한 다음 데이터베이스 쿼리를 수행하도록 해독하면 엄청난 오버 헤드가 추가됩니까?

이것은 기본 키를 사용하여 작업 할 수 있다는 것을 의미합니다. (물론 레코드를 볼 수있는 권한이 있는지 분명히 확인하더라도) 세션마다 고유 한 링크를 만들거나 세션 전체에서 언제든지 변경할 수 있습니다. AJAX 기반 콘텐츠를 많이 사용하고 싶지 않을 때 유용합니다.

정말 좋은 생각입니까?

답변

0

ID를 base64 인코딩/디코딩하지 않는 이유는 무엇입니까? 합법적 인 사용자가 실제로 장난감을 가지고 실험하는 것을 막기 위해이 작업을 수행하는 경우 실제로는 놀 수있는 권한이 있습니다. 특히 낙담시키려는 목적이있는 것은 아닙니다.

+0

게임을 개발한다면, 사람들은 항상 시도 할 것입니다. "게임"시스템. 상점에 재고가있는 경우 해당 가상 상점에있는 항목의 ID/ID를 북마크하고 나중에 직접 액세스하여 나중에 볼 수 있습니다. 물론 이것이 합법적이며 나는 그것을 막을 수는 없지만 링크가 매 세션마다 또는 30 시간마다 고유하고 해당 사용자에게 고유 한 경우 파킹을 중지합니다. – niggles

+0

사용자가 가상 ​​상점에서 임의의 항목을 찾을 수 있다면 누가 신경을 쓰나요? 왜 이것이 문제입니까? – Brian

+0

링크 북마크를 피하기 위해 모든 시간에 1 번 링크를 선호하거나 플레이어가 다른 플레이어 링크를 보낼 가능성을 선호합니다. – niggles

0

모든 요청에 ​​대해 사용 권한을 확실히 확인해야합니다. 보안을 위해 입력 데이터에만 의존해서는 안됩니다!

그리고 암호를 해독 할 수 있다면 해킹하려는 악의적 인 사용자도 기억해야합니다.

세션을 사용하여 사용 권한을 저장하는 것은 성능에 유리하게 트레이드 오프 (trade off) 보안이며, 평균 보안이 될 것이라고 생각합니다.

민감한 데이터가있는 경우 - 매번 요청할 때마다 확인하십시오. 적은 보안의 이름으로 몇 마이크로 초 동안 최적화하지 마십시오.


는 지금, 나는 사용자가 만드는 새로 고침하고 사용자의 세션에 저장 모든 추가 해시의 일종을 사용하는 것이 좋습니다 수있는 코멘트에있는 당신의 진짜 문제를 보았다. 그런 다음 사용자가 동일한 해시 예컨대 :

$hash = md5(microtime()); 
$_SESSION['secret_user_hash'] = $hash; 

를 사용하는 경우 확인과 같은 URL이에 넣어 :

&z=<?php echo substr($hash, 5, 10); ?> 

그리고 사용자가 요청을 한 후에는 같은 해시 경우 바로 확인.

무거운 AJAX를 사용하는 경우 해시를 세션에서 변경할 때 항상 업데이트해야합니다. 내가 생각할 수있는 가장 좋은 방법은 임의의 해시 (예 : 5)의 세션에 배열을 유지하고 쿼리에 무작위로 사용하는 것입니다. 그래서 당신은 더 큰 수영장을 가지고 있으며, 모든 요청 후에 당신은 업데이트 할 필요가 없습니다.

+0

이 함수는 여전히 사용 권한을 확인하고 실제로 중요한 데이터는 아닙니다. 데이터베이스를 리팩터링하거나 아무 것도 변경하지 않고 매번 고유 한 링크를 만들 수 있습니다. 나는 스트레이트 uid와 반대로 많은 암호화/암호 해독 쿼리를 수행하는 데 걸리는 시간을 테스트 할 수 있고 이것이 과도한 사용 상황, 즉 5000 명의 동시 사용자 등에 영향을 주는지 확인할 수 있습니다. – niggles

+0

"나는 어떤 종류의 추가 사용자가 만든 모든 새로 고침에 대한 해시를 만들고 사용자의 세션에 저장 한 다음 사용자가 즐겨 찾기를 중지하는 데 사용되는 동일한 해시 "->를 사용하는지 확인하고 각각의 모든 쿼리에 대해 문자열을 해독하는 오버 헤드가 적습니다 -> 그리고 나중에 다시 돌아올 수 없도록 X 분마다 해시를 새로 고칠 수 있습니다. – niggles

+0

암호화 및 암호 해독은 데이터베이스 사용만큼 비싸지 않으므로 데이터베이스의 기본로드가됩니다. 암호화에 대해 걱정하지 마십시오. 그냥 너무 복잡하게 만들지 마라. 해시에 관해서 - 오랫동안 게임 창을 열어두고 해시를 변경할 수있는 사용자가있을 수 있음을 기억하십시오. 세션을 활성 상태로 유지하고 해시를 변경하지 않기 위해 정기적 인 요청을 보내려고 할 수 있습니다. – bisko

0

UID를 해시로 만들고 전달합니다.

전체 스키마와 코드베이스를 리팩터링하지 않으려면 rot13/base64로 인코딩하십시오.

-1

왜 데이터에 액세스하는 방법에 관계가 있습니까? 액세스 및 표시는 두 개의 개별 항목입니다. 키를 쿼리에 사용해야하지만 원하지 않으면 키를 표시 할 필요가 없습니다.당신은 그것을 해쉬 할 수 있습니다. 그래서 mod URL을 볼 수 없도록 재 작성 할 수 있습니다 ... 여전히 여러 가지 옵션이 있습니다. 패턴을 설정하면 화면에 표시 할 수 있습니다. P + IDHASH + ANATTRIBUTE 또는 뭔가. 정수에서 base64를 사용하고 쿼리를 실행하여 디코딩하면 밀리 초 이상의 비용이 들지 않습니다. 당신이 당신의 쿼리에서 해쉬가 아니라는 것을 기억하십시오. 그래서 그들은 똑같이 유지 될 것입니다. 시간 이슈가 아닌 하나의 아이템을 인 코드/디코드 할 것입니다.

+0

이것은 기본적으로 MCRYPT_RIJNDAEL_256 및 base64 인코딩 + mod_rewrite로 구현하기 시작한 것이므로 다음과 같이 끝납니다. /bank/create_account/91xqJttvM61PH | 9d + ahAeDtZ2apBna8Yhz83deROZg = id = 1 인 은행을 쿼리하여 사용자 계정 9D + ahAeDtrZ2apBna8Yhz83deROZg =/LemOfavO6jNi1yZQbYgE0J | | 은행 사이의 거래 /은행/거래/91xqJttvM61PH 같은 것 MtLSyVePMkgauJPLTWxI = 그 bank.It에 $의 X를 보내는 것은 잘 작동하는 것 같다 - 당신은, 그것은 단지 작은 맞아있어 약간의 오버 헤드. – niggles