簡體   English   中英

如何在網站URL中對內容ID號碼進行Imgur式混淆? (PHP和MySQL)

[英]How to do Imgur-style obfuscation of content id number in website URL? (PHP&MySQL)

我正在嘗試混淆顯示內容的頁面的URL。 通過獲取內容ID號作為URL中的GET變量來顯示內容頁面。 我想混淆URL(如本SO post所述 )。 我在兩個答案中都嘗試了這些方法,但是一種方法給出的代碼太長,而另一種給出的代碼卻過於可預測。

我正在使用PHP,並且正在使用MySQL表存儲內容; 內容ID是一個自動遞增的列。 這意味着,如果我不混淆自己的URL,用戶將可以在URL中准確看到網站上有多少帖子,並且可以更改URL以查看其他帖子。 我想避免這種情況。

我希望對Imgur.com感到困惑:它們的內容ID代碼每個都是5個字符的代碼,包含字母,大寫字母和小寫字母。

為了避免進行一堆“加密”和“解密”,您可以為每個頁面使用唯一的密鑰對。 將另一個字段(VARCHAR 5)添加到頁面表中,稱為key,然后為每個頁面隨機生成一個key。

要生成密鑰,您可以加密一個隨機數

function random_key(){
    $crypt = crypt(rand(0,9999999), 'Whatever you want to say here.');
    return substr($crypt, 0, 5);
}

這將導致像?page=55-so3ph?page={$id}-{$key} )這樣的URL ?page=55-so3ph

然后使用它,你可以做類似的事情

<?php

if(empty($_GET['page']))
    die('missing ?page');

$page = explode('-', $_GET['page']);

if(count($page) != 2)
    die('invalid ?page');

list($page_id, $page_key) = $page;

if(!is_numeric($page_id))
    die('invalid page id');

$Post = your_query_method('SELECT * FROM pages WHERE id = ' . $page_id . ' AND key = "' . your_escape_function($page_key) . '"');

if(!$Post){
    header('Location: /invalid_page.html');
    exit;
}

//At this point we know that they ID key pair is correct

對於一個超級簡單的解決方案,它並不能真正阻止人們對您的URL進行反向工程,但可以阻止99.9999%的用戶,您可以執行以下操作

<?php
function hash_id($id){
    $crypt = crypt($id, 'Whatever you want to say here. Just SALT it!');
    $md5   = md5($crypt . 'You can do another SALT here.');
    return substr($md5, 0, 5);
}

if(empty($_GET['page']))
    die('missing ?page');

$page = explode('-', $_GET['page']);

if(count($page) != 2)
    die('invalid ?page');

list($page_id, $page_key) = $page;

if(!is_numeric($page_id))
    die('invalid page id');

$Page = your_function_to_get_page_by_id($page_id);

if(!$Page || hash_id($page_id) != $page_key){
    header('Location: /invalid_page.html');
    exit;
}

//the URL would look like ?page=55-so3ph

在帶有鹽的crypt和md5之間,使用超級計算機的人需要花費大量時間才能開始發現沖突。

我最終要做的事情很簡單:我將數字加密(確保密碼的輸出在一定范圍內),然后將數字轉換為以62為底的數字。

我選擇基數62是因為基數62中的字符是數字,大寫字母和小寫字母。 我確保密碼的輸出在一定范圍內,這樣當轉換為基數62時它將有一定數量的位數(在我的情況下,我在基數62中選擇了六位數)。

為了反轉代碼,我將其轉換回以10為基數並反轉密碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM