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


CSS files included with menu and PHP GET CSS selector

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

选择菜单已经完成,但现在我需要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的新手,我不知道代码是否安全或可以改进,但在从选择菜单更改时,我没有得到正确的主题。

有什么想法吗?

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

储存这个的饼干很好。为了你的安全考虑。如果您计划只在选择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?
}

regex-replace用于删除斜杠,以防止发现服务器外部的css文件/css目录。