如何隐藏或编码url与一些php函数


How to hide or encode the url with some php function?

大家好,

所以我有这个/insert_video。php形式的链接?15 video_tut_id =

15是一个由mysql查询生成的动态数

是否有一种方法来隐藏这个数字与php在url栏,这意味着而不是上面的东西在/insert_video.php的形式?video_tut_id=adjkh13123但是这个过程是可逆的,所以不像md5只有一种方法

有很多方法可以接近这个。有些网站使用"段塞"的概念,这通常涉及到使视频的标题对URL有效。而不是这样的url:

insert_video.php?video_tut_id=15

…你最终得到这样一个url:

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更令人兴奋的东西,那么许多有能力的人可能不会费心。

像后者这样的简单方法可以像使用chr (docs)将数字转换为字母一样简单。您可以使用"凯撒密码"并移动所有数字,然后在url中传递密钥(同样,这是一种低安全性的方法)。谷歌一下,从众多的自制加密方法中选择一种——所有这些都不安全,但对于一些简单的混淆来说已经足够好了。

说了这么多,而且不知道你的用例,通常不太需要费心向用户隐藏id。无论是否向用户隐藏这些id号,您都希望各种脚本实现安全性——获取id号不应该给潜在的攻击者任何重要信息。如果用户获得这些id是危险的,我建议您重新考虑您的安全模型,并确定为什么拥有id号会给某人提供"王国的钥匙"—它不应该,根本不应该,特别是如果id号包含您将向公众暴露的url的一部分。如果id字段非常重要,值得费心隐藏,那么最好不要暴露它,无论是否加密。

如果您想要混淆您的id,这是我猜您想要实现的,您有两种方法:

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

第二个想法是在auto_increment id旁边生成另一个唯一的id,并在url中使用这个id。例如,你可以对id +时间戳进行散列,将其存储在数据库中,将其添加到url中,然后进行查询。因为你的字符串是随机的,没人能猜出来。他可以尝试每一个字符串(这将花费一些时间)或入侵你的数据库。

根据您需要的安全性,选择第一个是为了易于实现和速度,第二个是为了安全性。

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

但是回答你的问题,看看这里的答案:https://stackoverflow.com/a/1289114/759049为PHP获得一些加密'解密函数。

这也取决于你不想透露视频id的原因。最常见的原因是,您不希望人们能够枚举您的服务器并猜测vid's以发现新内容。

在这种情况下,你可以在数据库中创建一个新字段,代表每个视频的唯一id,而不是增量的,比如php的uniqid();

现在代替/insert_video.php?video_tut_id=3,你可以做/insert_video.php?vuid=4b340550242239。在你的查询数据库,你引用这个字段而不是你的主键(video_tut_id)。

尽管您已经接受了答案,但我还是要分享我在生产环境中使用的类似代码。我使用它来创建一个url,该url使用原始$_GET数组中的所有参数进行编码。

保存到测试脚本中,并将其加载到浏览器中。然后尝试将杂项变量放到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 );