如何使用某些php函数隐藏或编码url?

时间:2011-12-12 21:27:29

标签: php security

美好的一天,

所以我的链接形式为/insert_video.php?video_tut_id=15

15 是从mysql查询生成的动态数字

有没有办法在网址栏中用php隐藏这个数字,这意味着代替上面的/insert_video.php?video_tut_id= adjkh13123 形式的东西,但这个过程是可逆的,所以不像只有一种方式的md5

5 个答案:

答案 0 :(得分:4)

有很多方法可以解决这个问题。有些网站使用“slug”的想法,这通常涉及使视频的标题对URL有效。而不是像这样的网址:

insert_video.php?video_tut_id=15

...你最终得到这样的网址:

insert_video.php?video_tut=how-to-make-cookies

这样的事情:

function slug($str) {
    $str = strtolower(trim($str));
    $str = preg_replace('/[^a-z0-9-]/', '-', $str);
    $str = preg_replace('/-+/', "-", $str);
    return $str;
}

另一种方法是为每个视频提供一个非数字“别名”。这与slug方法非常相似,但不是使用标题,而是使用关键字或随机字母和数字。

你提到的方法是从id中产生一些可逆的哈希,很容易通过各种方式实现,具体取决于你想要解密的难度。如果您需要高安全性,可以使用mCrypt库(docs)等选项。如果安全性不是一个高度关注的问题,你可以使用任何模糊的方法 - 用户可能在他们尝试的时候弄清楚它,但是如果他们不能从工作中得到任何东西比你在数据库表中使用的id,很可能很多有能力的人会打扰。

像后者这样的简单方法可以像使用chrdocs)将数字转换为字母一样简单。您可以使用“Caesar密码”并移动所有数字并在网址中传递密钥(同样,这是一种低安全性方法)。谷歌周围并选择众多家庭烘焙加密方法中的一种 - 所有这些都是非安全的,但足以进行一些简单的混淆。

尽管如此,并且不了解您的用例,通过这样的努力来隐藏您的用户身份通常并不是非常重要。您是否希望各种脚本实现安全性,无论您是否隐藏用户的这些ID号 - 获取ID号不应该给潜在的攻击者任何重要的东西。如果用户获取这些ID是危险的,我建议您重新考虑您的安全模型,并确定为什么拥有ID号码可以为某人提供“王国的钥匙” - 它不应该,尤其不是* 如果ID号码包含您将向公众公开的部分网址。如果id字段足够重要,可以通过这些痛苦来隐藏,那么从不暴露它,加密与否,你会得到更好的服务。

答案 1 :(得分:2)

如果你想捏造你的ids,这就是我想你想要实现的,你有两种方法:

使用一些可逆的算法或生成随机id并使用它。对于第一个想法,你可以使用base64或其他一些可逆的built_in算法,或者通过替换东西,用id计算(比如乘以15,减去2)和其他乐趣来构建你自己的算法。问题:如果有人知道你在做什么(base64,例如很容易识别并在几秒钟内解码),他可以对每个id进行逆向工程。

第二个想法是在你的auto_increment id旁边生成另一个唯一ID,并在url中使用这个id。例如,您可以对id +时间戳进行哈希处理,将其存储在数据库中,将其添加到URL中,然后查询它。由于你的字符串是随机的,没有人能猜到它。他可以尝试每个字符串(这需要一些时间)或破解你的数据库。

根据您需要的安全性,选择第一个以便于实施和速度,第二个选择安全性。

答案 2 :(得分:1)

实际上,为什么不将视频密钥存储在数据库中?它可以是名称或其他任何内容的哈希值。然后,您可以使用密钥查找内容,例如,就像YouTube一样。

但回答你的问题,请看一下这个答案:https://stackoverflow.com/a/1289114/759049为PHP获取一些加密\解密函数。

答案 3 :(得分:1)

这也取决于您不希望披露视频ID的原因。最常见的原因是您不希望人们能够枚举您的服务器并猜测视频以发现新内容。

在这种情况下,您可以在数据库中创建一个新字段,表示每个非增量视频的唯一ID,例如php uniqid();

现在代替/insert_video.php?video_tut_id=3,您可以执行/insert_video.php?vuid=4b340550242239之类的操作。在您对数据库的查询中,您引用此字段而不是主键(video_tut_id)。

答案 4 :(得分:0)

即使你已经接受了答案,我也会分享我的代码,这些代码在生产中用于类似的东西。我用它来创建一个用原始$ _GET数组中的所有参数编码的url。

保存到测试脚本并将其加载到浏览器中。然后尝试将misc变量放到url上。

<?

header( 'content-type: text/plain' );
$h = '';
if ( array_key_exists( 'h', $_GET ) && ! empty( $_GET['h'] ) )
{
    $test = unserialize( gzuncompress( base64_decode( urldecode( urldecode( $_GET['h'] ) ) ) ) );
    if ( is_array( $test ) )
    {
        $h = $_GET['h'];
        $_GET = $test;
    }
}
elseif( count( $_GET) )
{
    $h = urlencode( urlencode( base64_encode( gzcompress( serialize( $_GET ), 9 ) ) ) );
}

list( $url ) = explode( '?', $_SERVER['REQUEST_URI'] );

if ( ! empty( $h ) )
{
    $url .= '?h=' . $h;
}

echo $url . "\n\n";

var_dump( $_GET );