分享经验 版主:论坛审计组
整合Hashids,用于生成加密ID,防止ID暴露被穷举采集
类型:迅睿CMS 更新时间:2023-11-23 17:43:11 自定义函数 内容地址

整合Hashids,用于生成类似YouTube的Id,防爬虫。Hashids是一个小型的开放源代码库,可以将数字生成很短的、唯一的、非顺序的字符ID。 例如可以数字347转换为 “yr8” 字符串,你还可以将字符串ID进行解码恢复成数字。

WeChat631422186d09aee7177af7f116fef026


1、首先到Hashids官网下载PHP版本,开源地址:https://github.com/vinkla/hashids

2、在dayrui目录下新建目录ThirdParty

3、将下载好的Hashids上传至ThirdParty目录下

4、修改文件HashGenerator.phpHashids.php

namespace Hashids;

修改为

namespace Phpcmf\ThirdParty\Hashids;


5、添加自定义函数。config/custom.php


function eos_hashids( $id = '' , $operation = 'DECODE' , $key = 'G2cOwnsHcjnJAayk' , $length = '16'){

    $hashids = new \Phpcmf\ThirdParty\Hashids\Hashids($key, $length);

    if( $operation == 'DECODE' ){
    
        return intval($hashids->decode( $id )[0] ? $hashids->decode( $id )[0] : '0');
    
    }else if( $operation == 'ENCODE' ){
    
        return $hashids->encode($id);
    
    }else{
    
        return;

    }
}

具体配置请看官网,只需要知道operation和key和length,一个是密钥,一个是加密长度,DECODE是解密,ENCODE是加密


这个时候可以进行测试了,在模板页面添加

{eos_hashids('100','ENCODE')}

<br>

{eos_hashids('bQ58jBGvwNEVWp63','DECODE')}

不出意外就可以得到

bQ58jBGvwNEVWp63

100

6、添加加密url的函数,config/custom.php

// 详情ID
function eos_hashids_id($data){

    return eos_hashids($data['id'],'ENCODE');

}
// 栏目ID 
function eos_hashids_catid($data){ 

    return eos_hashids($data['id'],'ENCODE'); 
    
}

7,修改URL规则

WeChat44d092bbc1fd2b1ce2a4e6ee42e88bc1

8、更新缓存,重新生成内容地址,这个时候就得到了带有加密地址的url了,这个时候访问url会出现404,因为还差最后一步解密


WeChat06c4441b76b4810613322f51eb7d4b73


9、修改模块App / Article / Controllers / 目录下的 Category.php  ,15行

(int)\Phpcmf\Service::L('Input')->get('id'),

修改为

(int)eos_hashids(\Phpcmf\Service::L('Input')->get('id'),'DECODE'),


10、修改模块App / Article / Controllers / 目录下的 Show.php  ,13行

(int)\Phpcmf\Service::L('Input')->get('id'),

修改为

(int)eos_hashids(\Phpcmf\Service::L('Input')->get('id'),'DECODE'),


到此为止,ID加密就算是完成了,返回页面刷新试试。使用此函数可以进行很多加密,具体玩法可以自行研究。


感谢回帖!


回帖
  • user_falle
    #1楼    user_falle
    2023-07-19 14:11:40
    Chrome 0
    看看隐藏了啥
  • 自牧
    #2楼    自牧
    2023-07-19 16:13:38
    Chrome 0
    学习学习,刚好需要
  • 不停游的鱼
    #3楼    不停游的鱼
    2023-07-20 09:03:36
    Chrome 0
    我生成来看看
  • 自牧
    #4楼    自牧
    2023-07-25 00:15:19
    Chrome 0
    伪静态有点问题
  • Adai
    #5楼    Adai
    2023-07-25 15:19:28
    Edge 0
    自牧
    "post\/([a-zA-Z0-9-=]+)(\?.*)?$"        => 'index.php?s=article&c=show&id=$1',
    解决404
  • 自牧
    #6楼    自牧
    2023-07-26 22:46:24
    Chrome 0
    Adai 这个很实用,感谢分享
    "post\/([a-zA-Z0-9-=]+)(\?.*)?$"        => 'index.php?s=article&c=show&id=$1',
    可否改为共享模块的
    "post\/([a-zA-Z0-9-=]+)(\?.*)?$"        => 'index.php?c=show&id=$1',
    多模块的如何操作能不能参照官方给的// 判断url是否是来自自定义函数if (CMSURI) { $myfile = WRITEPATH.'myid/'.md5(urldecode(CMSURI)).'.txt'; if (is_file($myfile)) { $id = eos_hashids('file_get_contents($myfile)','ENCODE'); if ($id) { return [ CMSURI => 'index.php?c=show&id='.$id, // 这里写内容的地址 ]; } }}变为共享模块通用
  • SEO优化推广
    #7楼    SEO优化推广
    2023-08-26 10:15:01
    Edge 0
    学习学习,刚好需要
  • 小昕
    #8楼    小昕
    2023-11-23 17:43:11
    Chrome 0
    • 学习学习,刚好需要