【问题标题】:Is it possible to read a base64 url in the iframe tag?是否可以在 iframe 标签中读取 base64 url​​?
【发布时间】:2020-03-08 14:33:19
【问题描述】:

我正在寻找一种方法来“屏蔽”youtube 视频的网址,如下所示:

<iframe width="560" height="315" src="{{base64_encode($video-
>demo_src)}}" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-
picture" allowfullscreen=""></iframe>

$video->demo_src 是一个完整的 url(https://www.youtube.com/embed/JyCoMhjrRuA)...

有没有办法在不显示真实网址的情况下显示视频?

【问题讨论】:

  • 为什么要使视频网址不可用?是否要阻止下载文件?您是否只想向授权人员授予访问权限?

标签: php html laravel


【解决方案1】:

有没有办法在不显示真实网址的情况下显示视频?

没有。

浏览器必须向 URL 发出请求才能获取它的内容。

浏览器属于用户。

用户可以完全控制浏览器。

浏览器中的开发者工具提供了几种方法来确定请求的 URL。

即使您对其进行了混淆,用户也完全可以轻松获得去混淆后的 URL。

【讨论】:

    【解决方案2】:

    一个可能的解决方案是用PHP编码并通过Js解码:

    编码 PHP:

    <input type="hidden" id="url" value="{{base64_encode($course->demo_src)}}"/>
    

    通过JS获取url:

    <script>
      var video = document.getElementById("url").value;
    </script>
    

    现在创建一个 Js 文件并通过这个:

    $(document).ready(function () {
    var Base64 = {
    
        // private property
        _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
    
        // public method for encoding
        encode: function (input) {
            var output = "";
            var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
            var i = 0;
    
            input = Base64._utf8_encode(input);
    
            while (i < input.length) {
    
                chr1 = input.charCodeAt(i++);
                chr2 = input.charCodeAt(i++);
                chr3 = input.charCodeAt(i++);
    
                enc1 = chr1 >> 2;
                enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                enc4 = chr3 & 63;
    
                if (isNaN(chr2)) {
                    enc3 = enc4 = 64;
                } else if (isNaN(chr3)) {
                    enc4 = 64;
                }
    
                output = output +
                    this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
                    this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
    
            }
    
            return output;
        },
    
        // public method for decoding
        decode: function (input) {
            var output = "";
            var chr1, chr2, chr3;
            var enc1, enc2, enc3, enc4;
            var i = 0;
    
            input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
    
            while (i < input.length) {
    
                enc1 = this._keyStr.indexOf(input.charAt(i++));
                enc2 = this._keyStr.indexOf(input.charAt(i++));
                enc3 = this._keyStr.indexOf(input.charAt(i++));
                enc4 = this._keyStr.indexOf(input.charAt(i++));
    
                chr1 = (enc1 << 2) | (enc2 >> 4);
                chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
                chr3 = ((enc3 & 3) << 6) | enc4;
    
                output = output + String.fromCharCode(chr1);
    
                if (enc3 != 64) {
                    output = output + String.fromCharCode(chr2);
                }
                if (enc4 != 64) {
                    output = output + String.fromCharCode(chr3);
                }
    
            }
    
            output = Base64._utf8_decode(output);
    
            return output;
    
        },
    
        // private method for UTF-8 encoding
        _utf8_encode: function (string) {
            string = string.replace(/\r\n/g, "\n");
            var utftext = "";
    
            for (var n = 0; n < string.length; n++) {
    
                var c = string.charCodeAt(n);
    
                if (c < 128) {
                    utftext += String.fromCharCode(c);
                }
                else if ((c > 127) && (c < 2048)) {
                    utftext += String.fromCharCode((c >> 6) | 192);
                    utftext += String.fromCharCode((c & 63) | 128);
                }
                else {
                    utftext += String.fromCharCode((c >> 12) | 224);
                    utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                    utftext += String.fromCharCode((c & 63) | 128);
                }
    
            }
    
            return utftext;
        },
    
        // private method for UTF-8 decoding
        _utf8_decode: function (utftext) {
            var string = "";
            var i = 0;
            var c = c1 = c2 = 0;
    
            while (i < utftext.length) {
    
                c = utftext.charCodeAt(i);
    
                if (c < 128) {
                    string += String.fromCharCode(c);
                    i++;
                }
                else if ((c > 191) && (c < 224)) {
                    c2 = utftext.charCodeAt(i + 1);
                    string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                    i += 2;
                }
                else {
                    c2 = utftext.charCodeAt(i + 1);
                    c3 = utftext.charCodeAt(i + 2);
                    string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                    i += 3;
                }
    
            }
    
            return string;
        }
    
    }
    
    url = Base64.decode(video);
    
    $('#iframe').attr('src', url);
    
    });
    

    内嵌框架:

    前端结果会显示一个base64编码;这不是一种安全方式,但会使访问 url 变得困难。

    【讨论】:

    • "but makes access to url defficult" — 确实没有,因为您将其写回 DOM,因此在 DOM 检查器中可见并且浏览器必须向它发出请求,所以它在网络检查器中可见。
    • Base64 不是加密
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多