CSS 文件包含在菜单和 PHP GET CSS 选择器中

CSS files included with menu and PHP GET CSS selector

我需要访问者使用简单的下拉菜单主题更改主题颜色和背景 select 或者。 select 菜单将使用 GET 字符串 ?theme=choice 将表单发送到 index.php,PHP 将采用此 GET 并将其转换为站点的 css 主题。我有 5 个不同的 CSS 文件(主题)。

select 菜单已经完成,但现在我需要 PHP 以正确和安全的方式处理表单。我不知道 Cookies 是否是一个好方法,但很多人说 cookies 不是一个好主意,所以我的想法是可能只是将 ECHO 主题和 GET 主题添加到所有页面。

这是我拥有但无法正常工作的内容。我不知道如何让它变得更好,欢迎任何想法和帮助。

<head>
<?php
$theme = $_GET['theme'];
$security = mysqli_real_escape_string($theme); 
//don't know if needed because database will not be used for this

$onlynumbersandletters = preg_replace('/[^A-Za-z0-9\-]/', '', $security);
//allow only letters and numbers for more safety is needed ? 
// No database used but can someone hack a GET for this like in MySQL ?

//CODE
if(!empty($_GET['theme'])){
     echo '<link rel="stylesheet" type="text/css" href="css/default.css" />';
}

else {
     echo '<link rel="stylesheet" type="text/css" href="css/$onlynumbersandletters.css" />';
}

?>
<!-- other elements in head -->
</head>

我是 PHP 的新手,我不知道代码是否安全或可以改进,但是从 select 菜单更改时我没有得到正确的主题。

有什么想法吗?

只有当字符串在双引号中时,才能将变量打印到字符串中。你是单身,因此 $onlynumbersandletters 不会打印出来。它应该是这样的:echo '<link rel="stylesheet" type="text/css" href="css/'.$onlynumbersandletters.'.css" />';

存储这个的 Cookie 没问题。并出于您的安全考虑。如果您计划仅将该变量用于选择 css,则攻击者不会造成太大伤害。但是,如果必须,您可以检查 $theme 是否与您的 css 文件之一相同,如果不相同,则显示默认模板。

$dirty = isset($_GET['theme']) ? $_GET['theme'] : 'default';
$theme = preg_replace('/[^A-Za-z0-9\-]/', '', $dirty);
if (file_exists("./css/" . $theme . ".css")) {
    echo '<link rel"stylesheet" type="text/css" href="css/'.$filename.'.css" />';
} else {
    // what to do if file is not on disk?
}

正则表达式替换用于删除斜杠,以防止发现服务器上 ./css 目录之外的 css 文件。