我需要访问者使用简单的下拉菜单主题选择器更改主题颜色和背景。选择菜单会将表单发送到带有 GET 字符串 ?theme=choice 的 index.php,PHP 将采用此 GET 并将其转换为站点的 css 主题。我有 5 个不同的 CSS 文件(主题)。
选择菜单已完成,但现在我需要 PHP 以正确且安全的方式处理表单。我不知道 Cookie 是否是一个好方法,但很多人说 cookie 不是一个好主意,所以我的想法是可能只是将 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 的新手,我不知道代码是否安全或可以改进,但是从选择菜单更改时我没有得到正确的主题。
有什么想法吗?
最佳答案
仅当字符串在双引号中时,才能将变量打印到字符串中。你是单例,因此 $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 文件。
关于php - 菜单和 PHP GET CSS 选择器中包含的 CSS 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28918083/