PHP防止伪造URL提交数据的多种方案
针对通过浏览器地址栏伪造或篡改URL参数提交数据的安全问题,传统利用HTTP_REFERER校验域名首先进程容易失效。本文将解析该方法的局限性,并展示如何通过标准的HTML POST 表单或底层 JavaScript XHR 对象模拟异步请求,从机制上阻断伪造行为。
结果或目标
防止外部恶意用户通过修改 URL 参数直接提交数据至服务端,确保重要数据的来源合法性与安全性。
准备条件
- Web服务器环境:支持 PHP 解析(如 Apache、Nginx + PHP-FPM)。
- 基础脚本:具备编写简单 HTML 页面及 JavaScript 交互的能力。
- 核心代码模块:待引用的服务端校验函数与前端的 XMLHttpRequest (XHR) 封装方法。
真实操作顺序
第1步:使用服务端 Referer 进行初步校验(基础版)
目的:在接收数据前,检查请求是否来自本站域名,拦截简单的手动输入或外部链接跳转。
入口:后端 PHP 接口文件(如 submit_handler.php)。
动作:获取当前服务器名称,并与请求头中的 HTTP_REFERER 进行比较:
<?php
/* PHP防止站外提交数据的方法 */
function CheckURL(){
$servername = $_SERVER['SERVER_NAME'];
$sub_from = $_SERVER["HTTP_REFERER"];
if ($sub_from == '') { return false; } // 空Referer通常来自地址栏输入
$sub_len = strlen($servername);
// 简单截取比对逻辑
$checkfrom = substr($sub_from, 7, $sub_len);
if ($checkfrom != $servername) {
die("警告!你正在从外部提交数据!请立即终止!");
}
}
?>
第2步:理解Referer校验的缺陷
原因:CheckURL() 只能有效拦截用户手动在浏览器地址栏输入 URL 的情况。如果攻击者在其他服务器(如在论坛发帖、邮件内容)构造一个指向本站 URL 的超链接,点击该链接时,浏览器会自动带上合法的 HTTP_REFERER,导致上述防御完全失效。
结论:单纯依靠 Referer 并不绝对可靠,更安全的做法是从交互设计上改变提交方式。
第3步:采用标准 POST 方式提交(推荐基础方案)
目的:彻底避免数据暴露在 URL 中,杜绝 URL 参数被恶意篡改。
入口:前端 HTML <form> 元素。
动作:将表单的 method 属性设置为 post,并使用隐藏字段传递内部需要的标识数据:
<form method="POST" action="/process.php">
<!-- 正常用户可见字段 -->
<input type="text" name="user_data" />
<!-- 可选:插入隐藏的 text/hidden 用于传递防伪标记或Token -->
<input type="hidden" name="token" value="generated_token" />
<button type="submit">提交数据</button>
</form>
第4步:利用 AJAX 封装 XHR 发送请求(进阶防伪造方案)
目的:在不刷新页面的情况下,使用 JS 强制发起 POST 请求,进一步增加伪造难度,同时优化用户体验。
入口:页面底部的 JavaScript 脚本区域。
动作:创建一个兼容老版本 IE 的 createXHR 函数,并封装 ajaxPost 方法:
<script type="text/javascript">
/* 创建XHR对象 - 兼容老旧浏览器 */
function createXHR() {
if (window.XMLHttpRequest) {
var oHttp = new XMLHttpRequest();
return oHttp;
} else if (window.ActiveXObject) {
var versions = ["MSXML2.XmlHttp.6.0", "MSXML2.XmlHttp.3.0"];
for (var i = 0; i < versions.length; i++) {
try {
var oHttp = new ActiveXObject(versions[i]);
return oHttp;
} catch (error) {}
}
}
throw new Error("你的浏览器不支持AJAX!");
}
/* 用AJAX向page页面传递数据 */
function ajaxPost(url, query_string='') {
var xhr = createXHR();
// 使用 POST 方式打开连接
xhr.open('POST', url, false);
// 设置 Content-Type 为表单格式
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=gb2322");
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (xhr.status != 200) {
alert("请求失败");
return;
}
}
};
// 发送查询字符串
xhr.send(query_string);
}
</script>
随后在实际业务中调用 ajaxPost('your_page.php', 'data=value'); 即可。
完成判断
当用户在页面上触发提交按钮后,通过浏览器的网络监控工具(Network Tab)观察发出的 HTTP 请求:若使用 POST 方式,则不应再看到 GET 请求以及参数拼贴在 URL 上的现象;且服务端接收到的数据应当来自于请求体(Request Body)。此时,外部用户无法再通过修改 URL 参数来伪造请求。
简要总结
防范 URL 伪造的核心在于不要信任客户端传来的任何状态,并尽量改变数据的传输载体。从手动输入的 URL 转向由程序触发的 AJAX 或表单 POST 请求,是 Web 开发中保障数据传输安全的基础规范。以上就是PHP防止伪造数据从地址栏URL提交的详细方法,更多关于PHP安全最佳实践的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









