如何在网站URL中对内容ID号进行Imgur风格的混淆? (PHP&安培; MySQL的)

时间:2013-07-02 00:24:08

标签: php mysql url encryption

我正在尝试将URL混淆到显示内容的页面。通过在URL中将内容标识号作为GET变量来显示内容页面。我想混淆URL(如this SO post所述)。我在两个答案中尝试了这些方法,但是一种方法给出了过长的代码,另一种给出了过于可预测的代码。

我正在使用PHP,我正在使用MySQL表来存储内容;内容id是一个自动递增的列。这意味着如果我没有模糊我的网址,用户就可以在网址中看到网站上有多少帖子,并且可以更改网址以查看不同的帖子。我想避免这种情况。

我希望有类似于Imgur.com的混淆:他们的内容ID代码都是包含字母,大写字母和小写字母的5个字符的代码。

3 个答案:

答案 0 :(得分:1)

为了避免需要进行一堆“加密”和“解密”,您可以为每个页面使用唯一的密钥对。将另一个字段(VARCHAR 5)添加到名为key的pages表中,然后为每个页面随机生成一个键。

要生成密钥,您可以加密随机数

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}

的网址

然后使用它你可以做类似

的事情
<?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

答案 1 :(得分:0)

对于一个超级简单的解决方案,它并不会真正阻止人们对您的网址进行逆向工程,但会阻止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之间加盐,需要一个超级计算机的人花很多时间才能找到碰撞。

答案 2 :(得分:0)

我最终做的很简单:我加密数字(确保密码的输出在一定范围内)然后我将数字转换为基数62.

我选择了base 62,因为base 62中的字符是数字,大写字母和小写字母。我确保密码的输出在一定的范围内,这样当转换为基数62时,它将具有一定数量的数字(在我的情况下,我在基数62中选择了六位数字)。

要反转代码,我将其转换回基数10并反转密码。