检查 URL 参数是否存在

要使脚本正常工作,我们必须预先定义应用程序正在使用的 URL 参数。
我建议我们将 $defined 数组保存在某个设置文件中,这样代码就不会被设置弄乱。

在上面的脚本中,我们在 $defined_url_parameters 数组中定义 URL 参数。
要检查请求的参数是否存在,我们只需执行 if (!isset...){} 检查。
感叹号表示“不是”,因此如果数组索引未定义,我们将抛出 404 错误。

if(!isset($defined_url_parameters["{$url_parameter}"])) {
  //Send the 404 Response Code
  http_response_code(404);
  //Send the HTML body
  echo 'My king. Nothing by that name is known in this world.';exit();
}

exit();在这种情况下是必需的,因为我们在循环中工作。
循环本身将迭代来自 $_GET 超级全局的不同参数,并在请求未知参数时退出。

PHP 如何阻止 URL 参数

URL 参数是 URL 中问号 (?) 之后的部分,通常 PHP 使用它们根据输入的参数值传递内容。
在 PHP 脚本中,它们可以通过 $_GET 超级全局访问。

通常我们不希望不存在的参数起作用,因为它可能会导致搜索引擎出现重复的内容问题——除此之外,这是错误的。

当用户输入应用程序未使用的参数时,理想情况下我们应该向他们显示错误,例如 404 not found 或者 400 Bad Request 错误。

然而,这并非在所有情况下都有效,因为某些第三方模块/插件可能会向我们的 URL 添加参数以进行跟踪,这就是白名单派上用场的地方。

确保只有我们的白名单中预先批准的参数有效的一种简单方法是保留一组我们的应用程序实际使用的预先批准的参数。
当使用某些参数时,我们可能还需要添加一个 rel=canonical 元元素,以便将资源的规范 URL 告诉搜索引擎。

//Create a white-list of allowed URL parameters
$defined_url_parameters = array();
$defined_url_parameters['some_page_id'] = '';
$defined_url_parameters['another_parameter'] = '';
$defined_url_parameters['third_url_parameter'] = '';
//Check if requested parameters is allowed by the application
$requested_parameters = array_keys($_GET);
foreach ($requested_parameters as &$parameter) {
    if(!isset($defined_url_parameters["{$parameter}"])) {
      http_response_code(404);
      echo 'My king. Nothing by the name of '.htmlspecialchars($parameter).' is known in this world.';exit();
    }
}
日期:2020-06-02 22:15:26 来源:oir作者:oir