【问题标题】:CSS files included with menu and PHP GET CSS selector菜单和 PHP GET CSS 选择器中包含的 CSS 文件
【发布时间】:2015-03-07 17:54:28
【问题描述】:

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

选择菜单已完成,但现在我需要 PHP 以正确且安全的方式处理表单。我不知道 Cookies 是否是一个好方法,但很多人说 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 新手,我不知道代码是否安全或可以改进,但从选择菜单更改时我没有得到正确的主题。

有什么想法吗?

【问题讨论】:

    标签: php html css security themes


    【解决方案1】:

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

    存储它的 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 文件。

    【讨论】:

    • 好点。我错过了打印的东西。关于安全性如何检查主题是否相同?也许在包含 pages 时使用数组?像这样 $themes = array('theme1', 'theme2', 'theme3');问题是我不知道该怎么做
    • 不错。问题是代码的其余部分是什么......我对此并不陌生。对不起。在您的代码中,我查看 GET 字符串是否存在,但是当字符串为空或名称不正确时会发生什么?
    • 对不起,我忘记了。无论如何,我已经向您展示了相当不错的解决方案,您应该自己修复细节。
    • 所以查看代码我理解代码将执行以下操作:如果获取空字符串主题系统将显示主题“默认”如果真实存在的主题名称 1 它会显示主题名称 1 如果获取不存在的主题 FAke1系统会默认显示主题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2012-08-22
    • 2023-03-06
    • 1970-01-01
    • 2013-05-25
    • 2011-01-10
    相关资源
    最近更新 更多