2012-04-22 58 views
1

我为我的用户提供了一种方法,通过在其设置页面中输入一些CSS来更改其用户页面的CSS。下面是HTML:将用户输入过滤为CSS

<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 

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

感谢

+0

我从你的问题中删除了'yii'标签,因为这不是Yii特有的。 – DCoder 2012-04-22 10:12:43

回答

1

strip_tags()可以删除HTML所有实例虽然我不认为这是你唯一需要担心的事情。

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

+0

这似乎是最简单的方法,谢谢。 – q3d 2012-04-22 10:25:38

1

你可以尝试一个PHP解析器的CSS这样的:

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

但我不能告诉你的代码的质量什么它产生或它如何处理与输入的问题。

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

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

是的,这有效地使你能够在现场使用LESS syntax,但我没有看到这方面的伤害。 LESS在CSS通过的语法方面有些严格,无论列表中最后一个属性是否需要分号,并且额外字符也会触发错误。

虽然javascript版本的调试信息非常稳固,但我不能亲自证明PHP类,因为我只使用JS,但是从我听到的JS之后的第二个最好的东西开始。

2

这有什么形式的任何形状做的Yii。

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

这不是他们能用CSS做的所有事情。应手动删除以下条目:

  • 含线behavior: url(..)
  • 其中!important用于
  • 条目包含选择到特定的ID,如#ads#logo