我正在尝试将URL混淆到显示内容的页面。通过在URL中将内容标识号作为GET变量来显示内容页面。我想混淆URL(如this SO post所述)。我在两个答案中尝试了这些方法,但是一种方法给出了过长的代码,另一种给出了过于可预测的代码。
我正在使用PHP,我正在使用MySQL表来存储内容;内容id是一个自动递增的列。这意味着如果我没有模糊我的网址,用户就可以在网址中看到网站上有多少帖子,并且可以更改网址以查看不同的帖子。我想避免这种情况。
我希望有类似于Imgur.com的混淆:他们的内容ID代码都是包含字母,大写字母和小写字母的5个字符的代码。
答案 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并反转密码。