PHP $_REQUEST
1. PHP $_REQUEST
$_REQUEST 超全局变量用于收集来自 HTML 表单提交的数据、URL 查询字符串以及 HTTP Cookies 的数据。
换句话说,$_REQUEST 是一个包含了来自 $_GET、$_POST 和 $_COOKIE 超全局变量中所有数据的综合数组。
PHP 的超全局变量是内置变量,它们始终可以在所有的作用域中被直接访问!
您可以通过 $_REQUEST 关键字,紧接着使用表单字段的名称、查询参数名称或 Cookie 的名称来访问对应的数据。
注意: 由于 $_REQUEST 会合并来自不同来源(GET、POST 和 COOKIE)的数据,如果不小心处理,可能会引入安全漏洞。因此,虽然使用 $_REQUEST 很方便,但在大多数情况下,更推荐使用更具体、更明确的超全局变量 $_GET、$_POST 和 $_COOKIE。
2. 在 POST 请求中使用 $_REQUEST
在这里,我们将使用 $_REQUEST 超全局变量来访问通过 HTTP POST 请求提交的数据。POST 请求通常是用户通过 HTML 表单提交的数据。
HTML 表单必须将 method 属性设置为 "post",并包含带有 name 属性的输入字段。这个 name 属性将作为 PHP 脚本中获取数据的“键名(key)”。
下面是一个 HTML 表单的示例:
HTML 文件:
<html>
<body>
<form method="post" action="demo_request.php">
Name: <input type="text" name="fname">
<input type="submit">
</form>
</body>
</html>当用户点击提交按钮时,表单数据会被发送到 <form> 标签的 action 属性中指定的 PHP 文件。
在 PHP 文件中,我们可以使用 $_REQUEST 变量来收集输入字段的值。
PHP 文件 (demo_request.php):
$name = htmlspecialchars($_REQUEST['fname']);
echo $name;安全提示: 在使用来自超全局变量(如 $_REQUEST)收集的任何数据之前,务必对其进行验证和转义(清理),以防止像 XSS 这样的跨站脚本攻击漏洞。上面使用的 htmlspecialchars() 函数就是一种基本的转义方法。您可以使用 PHP 内置的过滤器(filter functions)来实现更稳健的过滤。
在下面的示例中,为了方便演示,我们将 HTML 表单和 PHP 代码放在了同一个 PHP 文件中:
示例
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// 收集输入字段的值并进行 XSS 防御处理
$name = htmlspecialchars($_REQUEST['fname']);
if (empty($name)) {
echo "Name is empty";
} else {
echo $name;
}
}
?>
</body>
</html>3. 在 GET 请求中使用 $_REQUEST
除了上文演示的方法(<form> 元素的 method 属性设为 "get")以外,GET 请求最常见的来源是URL 查询字符串(即在 URL 地址末尾附加的信息)。
下面是一个带有 URL 查询字符串的 HTML 链接示例:
HTML 链接带有 URL 查询参数:
<html>
<body>
<a href="demo_phpfile.php?subject=PHP&web=begindev.com">Test $GET</a>
</body>
</html>当用户点击上面的链接时,查询字符串中的数据(subject 和 web)会被发送到 demo_phpfile.php 脚本。
在目标 PHP 文件中,我们不仅可以使用 $_GET,同样可以使用 $_REQUEST 变量来收集查询字符串的值。
示例
demo_phpfile.php 文件的 PHP 逻辑:
<html>
<body>
<?php
// 使用 $_REQUEST 获取 URL 参数的值
$subject = htmlspecialchars($_REQUEST['subject']);
$web = htmlspecialchars($_REQUEST['web']);
echo "Study $subject at $web.";
?>
</body>
</html>