根据 PHP 文件中的 URL 选择颜色

Choosing a color based on URL in a PHP file

我已经看到使用 SVG 完成此操作,但我不确定要搜索什么才能找到类似的东西。我搜索的所有内容都是不相关的结果。

假设我有一个 PHP 文件,其中包含:

<style>
  .logo {

  }
</style>

我希望能够将 URL 键入 my.php?fill=be0000 并将 php 键入 return:

<style>
  .logo {
    fill: #be0000;
  }
</style>

我知道这很简单,我就是想不通。

有很多方法可以实现这一点,但这里有一个建议:

<style>
   .logo {
     fill: #<?= !empty($_GET["fill"]) ? $_GET["fill"] : "00bf00" ?>;
   }
</style>

这会将值设置为 fill GET 参数或 00bf00 中传递的任何值(如果未设置)。

我认为这里需要强调的是,简单地从查询字符串中获取数据并将其放入 HTML 内容中是完全错误的,应不惜一切代价避免。

例如,假设您的 PHP 代码包含以下内容:

$fill_color = !empty($_GET["fill"]) ? $_GET["fill"] : "ffffff";
echo ".logo { fill: #$fill_color; }\n";

不难看出,无论在查询字符串中为 fill 提供什么值,这段代码都能正常工作。例如,没有什么可以阻止某人请求 URL,如下所示:

http://example.com/?fill=red%3B%7D%3C%2Fstyle%3E%3Cscript%3Elocation.href%3D%22http%3A%2F%2Fevil.com%22%3C%2Fscript%3E

这将使您的网页立即重定向到 evil.com:

.logo { fill: #red;}</style><script>location.href="http://evil.com"</script>; }

这使得发起包括网络钓鱼和会话窃取在内的攻击变得简单,您确实应该不惜一切代价避免这些攻击。

如果您记得永远不要相信用户提供的数据,您就可以避免这些问题。在此示例中,您也许可以确保 fill 的值由六个十六进制数字组成, 而不是其他 。如果它没有通过这个测试,你应该忽略它。

您的代码应该如下所示:

$fill_color = "ffffff";
if (!empty($_GET["fill"]) && preg_match('/^[0-9a-f]{6}$/i', $_GET["fill"]) === 1) {
    $fill_color = $_GET["fill"];
}
echo ".logo { fill: #$fill_color; }\n";