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

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

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

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

展开原文

原文

I'm trying to obfuscate the URLs to the pages where content is displayed. Content pages are displayed by getting the content id number as a GET variable in the URL. I want to obfuscate the URL (as is described by this SO post). I tried the methods in both answers but one method gave overly long codes, and the other gave overly predictable codes.

I'm working in PHP, and I'm using a MySQL table to store content; the content id is an automatically incrementing column. This means that if I didn't obfuscate my URLs users would be able to see in the URL exactly how many posts there are on the website, and could change the URL to see different posts. I want to avoid this.

I was hoping to have obfuscation similar to Imgur.com: their content ID codes are each a 5-character code containing letters, capital letters and lowercase letters.

doulaobi7988
doulaobi7988 FYI你现在用字母和数字找到最多7个字符,当没有排列时它将是8,依此类推。
大约 7 年之前 回复
drr25281
drr25281 制作随机字母序列,并将关联存储到数据库中的ID?
大约 7 年之前 回复

3个回答



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

要生成密钥,您可以加密随机数</ p>

  function random_key(){
$ crypt = crypt(rand(0,9999999),'无论你想在这里说什么。');
返回substr($ crypt,0,5) ;
}
</ code> </ pre>

哪会产生类似的网页?page = 55-so3ph </ code>(?page = {$ id} - {$ key} </ code>)</ p>

然后使用它你可以做类似</ p>

 &lt;?  php 

if(空($ _ 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;
}

//此时我们知道 他们的ID密钥对是正确的
</ code> </ pre>
</ div>

展开原文

原文

To avoid needing to do a bunch of "encrypting" and "decrypting" you can use a unique key-pair for each page. Add another field (VARCHAR 5) to your pages table called key and then randomly generate a key for each page.

To generate the key you could crypt a random number

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

Which would result in a URL like ?page=55-so3ph (?page={$id}-{$key})

And then to use it you can do something like

<?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

dongnao9525
dongnao9525 “另一个给出了过于可预测的代码”让我产生了你的印象。
大约 7 年之前 回复
dongre6073
dongre6073 too long
大约 7 年之前 回复
doushi7314
doushi7314 那么你将拥有可预测的URL ......但是除非你做大规模的事情,否则没有人会花时间逆向工程你如何获得代码。
大约 7 年之前 回复
douyu7210
douyu7210 我意识到这种方法影响很小,并且不会太多地影响MySQL查询的速度,但我只是不想这样做。 我想编码id来获取URL中的代码,然后在需要时解码URL中的代码。
大约 7 年之前 回复
duande9301
duande9301 我同意......至少对我来说似乎影响不大。 您可以保存生成的随机整数,并在您进行验证时重新运行它。 按ID获取帖子,然后散列密钥号并与url密钥进行比较。
大约 7 年之前 回复
douchun5969
douchun5969 具体的索引原因是什么?
大约 7 年之前 回复
drn61317
drn61317 我意识到我能做到这一点; 我不希望出于索引的原因。
大约 7 年之前 回复



对于一个超级简单的解决方案,它并不能真正阻止人们对你的URL进行逆向工程,但会阻止99.9999%的用户你可以做类似的事情 </ p>

 &lt;?php 
function hash_id($ id){
$ crypt = crypt($ id,'无论你想在这里说什么。只是盐吧!') ;
$ md5 = md5($ crypt。'你可以在这里做另一个SALT。');
返回substr($ md5,0,5);
}

if(空($ _ GET ['页面 ']))
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');
退出;
}

// URL看起来像?page = 55-so3ph
</ code> </ pre>

在crypt和md5之间加盐,需要有人 用超级计算机很好的时间到圣 找到碰撞的艺术。</ p>
</ div>

展开原文

原文

For a super simple solution that does not really prevent people from reverse engineering your URLs but will deter 99.9999% of users you can do something like

<?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

Between crypt and md5 with salts, it would take somebody with a super computer a good chunk of time to start finding the collisions.



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

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

要反转代码,我将其转换回基数10并反转密码。</ p>
</ div>

展开原文

原文

What I've ended up doing is quite simple: I cipher the number (ensuring that the output of the cipher is within a certain range) then I convert the number to base 62.

I chose base 62 because the characters in base 62 are numerics, capital alphabets, and lowercase alphabets. I ensured the output of the cipher was within a certain range so that when converted to base 62 it would have a certain number of digits (in my case I chose six digits in base 62).

To reverse the code, I convert it back to base 10 and reverse the cipher.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问