1

我试图混淆显示内容的页面的 URL。通过将内容 ID 号作为 URL 中的 GET 变量来显示内容页面。我想混淆 URL(如本文所述)。我在两个答案中都尝试了这些方法,但一种方法给出了过长的代码,而另一种给出了过于可预测的代码。

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

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

4

3 回答 3

1

为避免需要进行大量“加密”和“解密”,您可以为每个页面使用唯一的密钥对。将另一个字段 (VARCHAR 5) 添加到名为 key 的 pages 表中,然后为每个页面随机生成一个 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

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

<?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
于 2013-07-02T01:06:26.720 回答
0

对于一个超级简单的解决方案,它不会真正阻止人们对您的 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 之间,拥有超级计算机的人需要很长时间才能开始发现冲突。

于 2013-07-02T17:11:21.607 回答
0

我最终做的事情非常简单:我对数字进行加密(确保密码的输出在一定范围内),然后将数字转换为基数 62。

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

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

于 2013-07-03T03:47:25.517 回答