0

我正在编写自己的下载跟踪器,我想为用户提供在下载页面上显示自定义消息的能力。我想允许 html 和 javascript,以便用户可以编写段落或使用广告代码等。

我将我的设置存储在配置文件中(不是我知道的最佳方式)

例子:<?php define("WAIT_MESSAGE", "htmlcodehere"); ?>

问题是引号或斜杠弄乱了配置文件,设置页面将无法加载。我已经研究过添加斜杠以尝试转义这些字符,但它只是添加了多个斜杠。

在我的配置文件中存储 html 内容/javascript 的最佳方式是什么?

编辑:尝试了几种方法,但是每次我单击保存以更新配置文件时,所有引号都被转义了 \"hello\" 变为 \"hello\" 等

4

5 回答 5

2

您不应该如此信任您的用户,以至于您让他们在您的网站上发布和保存 JavaScript 和 HTML。

于 2012-04-26T08:59:22.740 回答
0

您是否尝试过像单 ' 一样?

<?php define('WAIT_MESSAGE', '<p>Please wait.. your download starts shortly</p>'); ?>
于 2012-04-26T08:59:11.727 回答
0

那根本不安全。有人可以轻松地将 PHP 注入其中。

你能做的(这有点老套)是base64_encode()数据,以及base64_decode()当你需要使用它的时候。这样做将摆脱引号/特殊字符问题和安全问题。

在配置文件中编写 base64_encoded HTML 后,要使用它,您将执行以下操作:

<?php
    echo base64_decode(WAIT_MESSAGE);
?>
于 2012-04-26T09:02:05.717 回答
0

允许用户在您的页面中实际插入 HTML/Javascript/PHP 是一件非常糟糕的事情

说了这么多,这个问题时常困扰着我们所有人。您需要以某种不会改变上述代码含义的格式存储 HTML 代码。

此问题通常通过将任何此类字符转换为其等效的 HTML 实体来解决,以便您可以安全地存储

查看http://php.net/manual/en/function.htmlspecialchars.phphttp://www.php.net/manual/en/function.htmlspecialchars-decode.php了解更多信息。

于 2012-04-26T09:05:55.067 回答
0

就个人而言,我会在数据库中保存任何可编辑的值以确保安全,但如果您真的想要/需要编辑 php 配置文件,那么这可能是最安全的方式。

<?php 
/*Function to check if magic_quotes is enabled.
 (Stops double slashes happening)
*/
function check_magic_quotes($value){
    if (get_magic_quotes_gpc()) {
        return stripslashes($value);
    } else {
        return $value;
    }
}

/*Form was posted, 
You should also do a check to see if logged in and have rights to edit*/
if($_SERVER['REQUEST_METHOD']=='POST'){
    //Check for magic quotes and then base64_encode the string.
    $value = base64_encode(check_magic_quotes($_POST['configVal']));

    /*Use heredoc to create the php line for the config & insert the
      base64 encoded string into place*/
$config=<<<CONFIG
    <?php define("WAIT_MESSAGE", '$value'); ?>
CONFIG;

    file_put_contents('someConfig.php',$config);
}


//When you want to include the config
include('someConfig.php');

/*To echo out the config value: base64_decode it,
  and then htmlentities encode it, to protect from XSS*/
echo 'This was included: '.htmlentities(base64_decode(WAIT_MESSAGE));


//Basic form with current value when someConfg.php has not been included
$config = file_get_contents('someConfig.php');
preg_match("#\"WAIT_MESSAGE\", '(.*?)'#",$config,$match);
 ?>

<form method="POST" action="">
  <p>Config Value:<input type="text" name="configVal" value="<?php echo htmlentities(base64_decode($match[1]));?>" size="20"><input type="submit" value="Update"></p>
</form>
于 2012-04-26T09:54:37.440 回答