当前位置:   article > 正文

文件安全之只允许网站内打开,禁止单独打开下载_nginx配置视频内嵌播放不允许下载

nginx配置视频内嵌播放不允许下载

有时候我们并不想一个网站文件,禁止单独打开,

举例:ios潮汐的音频文件,按道理都是收费的,肯定禁止别人通过某些手段获取到文件,但是潮汐目前大部分都能在web里面抓包抓取到,并且提取出来

这么防止这种数据安全呢?今天就拿我唯一玩的比较熟悉的语言php做一个demo释放:

 

1:首先,我们就拿laravel框架举例,例如我在 我在项目app文件夹下新建了一个文件default_thumb

2:在nginx里面配置路由重点  internal;

  1. location /default_thumb {
  2. root D:/phpstudy_pro/WWW/bamboo/app;
  3. add_header Content-Type 'image/png';
  4. #下面可以先注释,直接浏览器打开default_thumb文件夹下一站图片尝试,是否可以打开,可以打开后在去掉前面的#号
  5. #internal;
  6. }

 3:例如我们/default_thum文件夹下面有一个containers文件夹,下面有1_demo.jpg的图片一张

假设当前网站url访问路径是dd.com,那么浏览器访问:http://dd.com/default_thumb/containers/1_demo.jpg 

4:如果访问能成功,这里就可以把nginx里面的internal;前面#去掉

5:重启nginx,在访问是不文件已经不能访问了,这就需要代码解决了访问问题了

 

6:在项目新建一个控制器,新建一个方法:例如新建了image控制器,preview方法,参考代码如下

 

  1. class ImageController extends Controller
  2. {
  3. /**
  4. * 获取图片
  5. * @param string $path
  6. * @return JsonResponse
  7. * @date 2020/12/17 19:38
  8. */
  9. public function preview($path = '')
  10. {
  11. $path = base64_decode($path);
  12. if (empty($path)) {
  13. return $this->formatReturn([
  14. 'state' => false,
  15. 'error' => '图片路径为空'
  16. ]);
  17. }
  18. $imagesPath = explode('/', $path);
  19. //便于windows和linux系统转义符问题 linux可去掉
  20. $path = implode(DIRECTORY_SEPARATOR, $imagesPath);
  21. //app_path()方法注解 app('path').($path ? DIRECTORY_SEPARATOR.$path : $path);
  22. $src = app_path('default_thumb' . DIRECTORY_SEPARATOR) . $path;
  23. $delimiter = DIRECTORY_SEPARATOR . 'default_thumb' . DIRECTORY_SEPARATOR;
  24. if (!file_exists($src)) {
  25. return $this->formatReturn([
  26. 'state' => false,
  27. 'error' => '对应图片不存在'
  28. ]);
  29. }
  30. $filename = end($imagesPath);
  31. $ext=explode('.', $filename);
  32. $fileExt = end($ext);
  33. $mimeTypeArr = array(
  34. 'png' => 'image/png',
  35. 'gif' => 'image/gif',
  36. 'jpg' => 'image/jpeg',
  37. 'jpeg' => 'image/jpeg',
  38. );
  39. $mimeType = isset($mimeTypeArr[$fileExt]) ? $mimeTypeArr[$fileExt] : 'image/jpeg';
  40. //便于windows和linux系统转义符问题在转换回来 linux可去掉
  41. $path=$delimiter.$path;
  42. $filepath = implode('/', explode(DIRECTORY_SEPARATOR, $path));
  43. // 下载
  44. //header("Content-Disposition: attachment; filename= '{$filename}'");
  45. // 内嵌
  46. header("Content-Disposition: inline; filename= '{$filename}'");
  47. header("Content-Type:" . $mimeType);
  48. header('X-Accel-Redirect:' . $filepath);
  49. header("X-Accel-Buffering: yes");
  50. header("X-Accel-Limit-Rate :102400"); //速度限制 Byte/s
  51. }
  52. public function formatReturn(array $params, $cookie = '')
  53. {
  54. if (!isset($params['code'])) {
  55. $params['code'] = '';
  56. }
  57. if (isset($params['error']) && strpos($params['error'], 'SQLSTATE')) {
  58. if (env('APP_ENV') != 'local') {
  59. $params['error'] = '数据库查询有误';
  60. }
  61. }
  62. if (empty($cookie)) {
  63. return response()->json($params);
  64. } else {
  65. return response()->json($params)->cookie($cookie);
  66. }
  67. }

7:有了控制器和方法,在配置路由,就假设在 在web.php里面新加路由

Route::get('image/{path?}', "ImageController@preview");

8:做好了这些,看到路由后面只能接收一个参数,而且加上nginx配置了/default_thumb  所以访问http://dd.com/default_thumb/containers/1_demo.jpg 

需要把containers/1_demo.jpg 这个去解析成一个字符串,控制器方法里面是base64的,这里我们就拿到https://base64.us/,里面去编码一下,

结果就成了Y29udGFpbmVycy8xX2RlbW8uanBn

10:浏览器按照路由输入:https://dd.com/image/Y29udGFpbmVycy8xX2RlbW8uanBn 结果如下图,到这里就结束了,记住nginx里面internal;很重要

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/338480
推荐阅读
相关标签
  

闽ICP备14008679号