HOME » Dream » 自建图库开启token防恶意使用

September 22, 2018

自建图库开启token防恶意使用

分类:Dream · 评论:0 条 · 热度:769℃

我们经常有建立一个图库的想法,以储存自己的图片,但是我们又常常担心图库被恶意采集、滥用、甚至是攻击,Token技术即可解决这一难题。
思路,某一页面需要显示图片,则该页面就产生一个唯一token(临时密令),将Token存入数据库,然后以GET形式附带token参数向图片服务器发起请求。图片服务器收到请求后检查Token,数据库中存在即可输出图片,并删除token记录,否则返回错误信息。

首先需要在MySQL数据库中建立一张表token,添加id与token列。

显示图片的页面

<?php
//生成ID
$id=Fun::token(32);
//生成token
$token = Fun::token(66);
//判断数据库写入并请求图片
if (Fun::query('insert into token (id,token) values (\''.$id.'\',\''.$token.'\')')) {
    echo '<img src="http://yourdomain.com/image.php?id='.$id.'&token=' . $token . '" />';
}
//核心类
class Fun
{
    //数据库地址
    private static $dbHost = '127.0.0.1';
    //数据库用户名
    private static $dbUser = '';
    //数据库密码
    private static $dbPass = '';
    //数据库名
    private static $dbName = '';
    //数据库端口
    private static $dbPort = '3306';
    //执行query语句
    public static function query($query)
    {
        $connect = mysqli_connect(self::$dbHost, self::$dbUser, self::$dbPass, self::$dbName, self::$dbPort);
        mysqli_set_charset($connect, 'utf8');
        $result = mysqli_query($connect, $query);
        mysqli_close($connect);
        return $result;
    }
    //生成指定长度随机字符串
    public static function randstr($length)
    {
        $str = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $randstr = '';
        for ($i = 1; $i <= $length; $i++) {
            $randstr .= $str[mt_rand(0, 61)];
        }
        return $randstr;
    }
    //生成token
    public static function token($length)
    {
        $token = base64_encode(self::randstr($length));
        return $token;
    }
}

图片服务器唯一入口

<?php
//判断GET参数
if (!empty($_GET['token']) && !empty($_GET['id'])) {
    //对数据库进行比较
    if (($token = Fun::getr('select * from token where id=\''.$_GET['id'].'\'')) && $token[0]['token'] == $_GET['token']) {
        //删除临时验证token
        if (Fun::query('delete from token where id=\'token\'')) {
            ##自由操作区##
            ##以随机输出图片为例##
            header('content-type:image/jpeg');
            $file = __DIR__ . '/' . mt_rand(0, 999) . '.jpg';
            echo file_get_contents($file);
            ##自由操作区##
        } else {
            echo 'Server Unavailable!';
        }
    } else {
        echo 'Server Unavailable!';
    }
} else {
    echo 'Server Unavailable!';
}
//核心类
class Fun
{
    //数据库地址
    private static $dbHost = '127.0.0.1';
    //数据库用户名
    private static $dbUser = '';
    //数据库密码
    private static $dbPass = '';
    //数据库名
    private static $dbName = '';
    //数据库端口
    private static $dbPort = '3306';
    //执行query语句
    public static function query($query)
    {
        $connect = mysqli_connect(self::$dbHost, self::$dbUser, self::$dbPass, self::$dbName, self::$dbPort);
        mysqli_set_charset($connect, 'utf8');
        $result = mysqli_query($connect, $query);
        mysqli_close($connect);
        return $result;
    }
    //返回查询结果
    public static function getr($query)
    {
        $connect = mysqli_connect(self::$dbHost, self::$dbUser, self::$dbPass, self::$dbName, self::$dbPort);
        mysqli_set_charset($connect, 'utf8');
        $result = mysqli_query($connect, $query);
        $allrows = mysqli_fetch_all($result, MYSQLI_ASSOC);
        mysqli_close($connect);
        return $allrows;
    }
}

[scode type="lblue"]演示[/scode]
演示地址

每次都会生成新的图片地址,每个图片地址仅可有效使用一次。

原文地址 : https://shifeiti.cn/16.html

暂无评论

默认头像
支持markdown语法
果青小站

果青

嘀嗒的雨点,溅起一圈圈如凄美回忆般的涟漪。