如何使用JS/jQuery或PHP隐藏iframe/embed标签的src属性?
解决方案:后端防护为主,前端增强为辅
首先明确:前端无法完全隐藏PDF的真实源URL——浏览器要加载PDF就必须获取真实地址,开发者工具总能抓到。要实现「禁止直接获取源URL,但允许下载」,核心得靠后端控制,前端仅能增加获取难度。
1. 后端代理PDF请求(核心方案)
不让前端直接接触真实文件路径,通过PHP接口转发PDF内容,前端看到的只是接口URL,真实文件地址完全在后端处理。
前端代码修改:
<?php // 用加密算法生成文件标识(避免直接暴露文件名) $secretKey = "你的加密密钥"; $iv = "16位初始化向量"; // AES-256-CBC需要16位IV $fileIdentifier = openssl_encrypt($_GET['url'], "AES-256-CBC", $secretKey, 0, $iv); ?> <embed id="renderedPrint" style="height:calc(100% - 4px);width:calc(100% - 4px);padding:0;margin:0;border:0;" src="pdf-proxy.php?id=<?php echo urlencode($fileIdentifier); ?>"> </embed>
新建pdf-proxy.php代理文件:
<?php $secretKey = "你的加密密钥"; $iv = "16位初始化向量"; // 和前端加密用的一致 // 解密获取真实文件名 $encryptedId = $_GET['id']; $filename = openssl_decrypt(urldecode($encryptedId), "AES-256-CBC", $secretKey, 0, $iv); // 安全校验:防止目录遍历攻击 $allowedDir = realpath("assets/labels/"); $filePath = realpath($allowedDir . "/" . $filename . ".pdf"); if (strpos($filePath, $allowedDir) !== 0) { die("无效请求"); } // 设置响应头,允许浏览器内嵌预览+下载 header("Content-Type: application/pdf"); header("Content-Disposition: inline; filename=\"" . basename($filePath) . "\""); header("Content-Length: " . filesize($filePath)); // 输出PDF内容 readfile($filePath); exit;
关键说明:
- 前端的
src指向代理接口,真实文件路径不会暴露给用户; - 代理里可额外加权限校验(比如用户登录状态、访问次数限制);
- 就算用户拿到接口URL,也无法直接获取到真实PDF路径。
2. 前端增强:增加获取难度(辅助手段)
仅靠前端无法阻止技术人员获取URL,但能拦掉大部分普通用户:
$(document).ready(function() { // 拆分路径片段,避免直接暴露完整字符串 const pathParts = ["assets", "labels", "<?php echo $url; ?>", ".pdf"]; // 简单混淆:字符反转后再恢复 const mixed = pathParts.join('/').split('').reverse().join(''); const realSrc = mixed.split('').reverse().join(''); $("#renderedPrint").attr("src", realSrc); });
3. 服务器配置:禁止直接访问PDF文件
配合代理方案,在服务器层面拦截直接访问PDF的请求,彻底封死真实路径的访问入口:
- Nginx:在配置文件中添加
location /assets/labels/ { deny all; return 403; } - Apache:在
assets/labels/目录下新建.htaccess文件Order Deny,Allow Deny from all
内容的提问来源于stack exchange,提问作者Thowzif
相关产品推荐
相关产品推荐

