문제

편집하다: 이후 ID를 변환하는 효율적이고 우아한 솔루션을 찾아 출판했습니다. 3141592 다음과 같은 문자열에 vJST 그리고 거꾸로. PHP에서 사용할 수 있습니다.

https://github.com/delight-im/php-ids

일부 배경을 제공하면 Knuth의 곱셈 해싱과 기본 변환을 사용하여 고유 한 가역적 인 비 순위화 ID를 생성합니다.

문제:

주어진 ID에 따라 내용이 표시되는 PHP에 동적 페이지가 있습니다. ID는 항상 get 매개 변수를 통해 제출됩니다. page.php? id = x 문제가 발생합니다. 사이트 방문자는 ID를 열거하고 모든 다른 콘텐츠 페이지를 걸어 갈 수 있습니다. 물론 이것은 불가능해야합니다.

어떻게 해결할 수 있습니까?

내 접근 방식은 나중에 GET 매개 변수로 사용되는 링크 및 양식에서 모든 ID를 인코딩하는 것입니다. 모든 페이지의 시작 부분에서 주어진 ID는 데이터베이스에서 사용되는 "실제"ID로 디코딩됩니다. 이것은 좋은 접근법입니까? 다른 방법을 선택 하시겠습니까?

내 접근 방식의 가능한 해결책 :

정수 ID를 Base 38 Integer로 변환하고 주어진 목록의 문자로 숫자를 교체합니다. 인코딩 된 문자열 ID 에이 문자를 사용합니다.

AZ 0-9- _

다른 캐릭터도 사용 하시겠습니까? 이 문자들에게는 내 대본이 다음과 같습니다.

function id2secure($old_number) {
    $alphabet_en = array(0=>'1', 1=>'3', 2=>'5', 3=>'7', 4=>'9', 5=>'0', 6=>'2', 7=>'4', 8=>'6', 9=>'8', 10=>'a', 11=>'c', 12=>'e', 13=>'g', 14=>'i', 15=>'k', 16=>'m', 17=>'o', 18=>'q', 19=>'s', 20=>'u', 21=>'w', 22=>'y', 23=>'b', 24=>'d', 25=>'f', 26=>'h', 27=>'j', 28=>'l', 29=>'n', 30=>'p', 31=>'r', 32=>'t', 33=>'v', 34=>'x', 35=>'z', 36=>'-', 37=>'_');
    $new_number = '';
    while ($old_number > 0) {
        $rest = $old_number%38;
        if (!isset($alphabet_en[$rest])) { return FALSE; }
        $new_number .= $alphabet_en[$rest];
        $old_number = floor($old_number/38);
    }
    $new_number = strrev($new_number);
    return $new_number;
}

추가 질문 :

내 기능의 역 함수는 무엇입니까?

나는 당신이 나를 도울 수 있기를 바랍니다. 고맙습니다!

도움이 되었습니까?

해결책

사용자가 웹 사이트를 통해 페이지를 방문 할 수 있습니까? 대답이 예라면 이것이 실제로 문제인지 아닌지 스스로에게 물어봐야합니다.

그렇지 않다면 문제는 페이지를 확보하지 못하거나 다른 방법으로 말하지 않는다는 것입니다. 보안에 대한 모호함에 의존하고 있습니다. 이는 결코 좋은 움직임이 아닙니다.

나의 충고? 올바른 사용자 만 액세스 할 수 있거나 걱정하지 않도록 페이지를 확보하십시오.

실제로 걱정해야한다면 주어진 페이지에 맞는 추가 필드를 전달하십시오. 나는 이것을 ID에서 구성하지 않을 것입니다. 데이터베이스에서 페이지 항목을 만들 때 다른 숫자 나 안내서를 생성 할 수 있습니다. 두 필드가 올바르지 않으면 페이지를 표시하지 마십시오.

간단한 캐릭터 대체 및 기타 순진한 난독 화 기술을 잊어 버리십시오. 그들은 당신의 시간 낭비입니다.

편집하다: 동일한 길이 인 비 순위화 ID를 사용하는 경우 자동 점수 기본 키 대신 UUID를 사용하는 것을 고려하십시오. 기본적으로 이것은 응용 프로그램 수준에서 수행됩니다.

  • 기본 키를 Char (36)로 변경하십시오.
  • 삽입 문에서 키를 설정하고 mysql uuid () 함수로 채워야합니다.

보세요 uuid에게 또는 uuid에? 그리고 기본 키로 UUID. 이것으로부터 성능 저하 (특히 조회를 위해 정수가 아닌 문자를 사용하기 때문에)가 있지만, 큰 (1 백만+ 행) 또는 데이터가 없다면 실제로는 문제가되지 않을 것입니다.

다른 팁

a Luhn과 같은 체크섬 알고리즘:

$id = 1337;

$_GET['id'] = Luhn($id, 3); // 1337518, adds 3 checkdigits
$_GET['id'] = Luhn_Verify($_GET['id'], 3); // 1337, returns the original number of false if validation fails

echo $_GET['id']; // 1337

편집 : 언급을 잊어 버렸지만이 방법을 사용하면 데이터베이스를 쿼리하지 않고도 ID가 유효한지 확인할 수 있습니다.

$id = Luhn_Verify($_GET['id'], 3);

if ($id === false)
{
    // someone is trying to guess the ID
}

else
{
    // $id is valid, do the DB stuff here
}

패턴을 추측하기가 어렵지만 페이지를 순차적으로 걸을 수 있습니다. 루트 패턴이 순차적이라면 결국 문제가 발생할 수 있습니다 (실제로 처음에는 문제가되고, 아이디어가 마음에 들지 않는 것이 아니라).

ID에 난수를 사용할 수 있습니다. 이는 페이지 ID 및 페이지 주문을 쉽게 추측하지 못할 것입니다 (다시 한 번 중요한 경우).

당신은 또한 사용할 수 있습니다 해시드 ID를 인코딩/디코딩하려면

이 코드는 URL과 같은 가시 장소에 생성 된 ID를 배치하려는 의도로 작성되었습니다.

Hashids는 숫자에서 짧고 고유 한 비 순위 ID를 생성하는 작은 오픈 소스 라이브러리입니다.
347과 같은 숫자를 "YR8"과 같은 문자열로 변환하거나 [27, 986]과 같은 숫자 배열을 "3KTMD"로 변환합니다.
해당 ID를 다시 해독 할 수도 있습니다. 이것은 여러 매개 변수를 하나로 묶거나 단순히 짧은 UID로 사용하는 데 유용합니다.

나는이 "문제"에 대해 신경 쓰지 않을 것이지만 어쨌든 나는 그러한 방법 중 하나에 사용했습니다.

새 페이지를 DB에 저장 한 후 md5 of (record_id + page_title) 그리고 그것을 특별 분야에 넣습니다 pagecode. 그런 다음 ID 대신 해당 페이지 코드로 페이지에 액세스했습니다. 그리고 색인을 인덱싱하는 것이 좋습니다 pagecode 데이터베이스의 필드.

사이트 방문자는 ID를 열거하고 모든 다른 컨텐츠 페이지를 걸어 갈 수 있습니다. 물론 이것은 불가능해야합니다.

왜 이것이 문제가되어야하는지 잘 모르겠습니다. 사람들은 웹 사이트에서 모든 (공개, GoogleBot -Indexed) 페이지의 목록을 입력하여 타이핑하기 만하면됩니다. site:domain.com Google에 들어가서 원하는 경우 루프. 사용하는 고유 인덱스를 변경해도 변경되지 않습니다.

그러나 방문자가 페이지에 직접 액세스하는 것을 원하지 않는다면 간단한 빠른 픽스는 Get 대신 게시물을 사용하는 것입니다.

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