1

我正在为我的用户提供一种通过在他们的设置页面中输入一些 CSS 来更改其用户页面的 CSS 的方法。这是HTML:

<textarea class="code" name="Settings[css]"></textarea>

在控制器中:

$model = new Profile;
$model->css = $_POST['Settings']['css'];

我目前不验证 CSS 字段的输入。我想知道我是否可以过滤 CSS,以便他们无法将有害代码放入页面。例如,他们可以这样做:

</style>
Now I can put bad code in to your page

我不认为用 HTMLpurifier 净化 css 是合适的,因为 CSS 通常包含特殊字符,但如果我错了,请纠正我。

谢谢

4

3 回答 3

2

这与任何形式的 Yii 无关。

如果您将用户 CSS作为外部文件包含在内,则可以轻松删除您在示例中提供的“无效代码” 。

这还不是他们可以用 CSS 做的全部。您应该手动删除以下条目:

  • 包含的行behavior: url( .. )
  • !important使用的所有实例
  • 包含特定 ID 的选择器的条目,例如#ads#logo
于 2012-04-22T10:11:37.697 回答
1

strip_tags()可以从输入中删除 html 标签,尽管我认为这不是您唯一需要担心的事情。

一个更简单的解决方案可能是通过外部样式表 ( <link rel="stylesheet" type="text/css" href="userstyle.php?uid=1235" />) 而不是内联样式块加载此样式,这样就无法突破。

于 2012-04-22T10:11:57.027 回答
1

您可以尝试这样的 php css 解析器:

https://github.com/sabberworm/PHP-CSS-Parser

但我无法告诉你它产生的代码质量或它如何处理输入问题。

我所知道的是,LESS 通常具有良好的调试功能。

如果您使用LESS php 类,您可以构建一个$_POST['Settings']['css']用于创建有效 CSS 的系统。或者,如果发生错误,您可以捕获它们并将其返回给浏览器。

是的,这有效地使您能够在该字段中使用LESS 语法,但我不认为这样做有什么害处。LESS 在某些方面在 CSS 的语法中更加严格,无论它是否在列表中的最后一个属性和额外的字符也会触发错误,都需要分号。

虽然 javascript 版本的调试信息非常可靠,但我不能亲自担保 PHP 类,因为我只使用 JS,但据我所知,它是仅次于 JS 的第二好的东西。

于 2012-04-22T10:08:17.500 回答