将用户输入过滤为CSS

时间:2012-04-22 09:56:53

标签: php html css

我正在为我的用户提供一种方法,通过在他们的设置页面中输入一些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通常包含特殊字符,但如果我错了,请纠正我。

由于

3 个答案:

答案 0 :(得分:2)

这与任何形式的Yii无关。

&#34;无效代码&#34;如果将 User CSS 包含在外部文件中,则可以轻松删除示例中提供的内容。

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

  • 包含behavior: url( .. )
  • 的行
  • 使用!important的所有实例
  • 包含特定ID选择器的条目,例如#ads#logo

答案 1 :(得分:1)

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

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

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

我所知道的是LESS通常有很好的调试。

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

是的,这有效地使您可以在现场使用LESS syntax,但我没有看到其中的伤害。在某种程度上,在CSS的语法中,LESS更加严格,不管它是否是列表中的最后一个属性,还是额外的字符也可以触发错误,都需要分号。

javascript版本的调试信息非常可靠,我不能亲自担保PHP类,因为我只使用JS,但从我听到它是JS之后的第二个最好的东西。

答案 2 :(得分:1)

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

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