我正在为我的用户提供一种方法,通过在他们的设置页面中输入一些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通常包含特殊字符,但如果我错了,请纠正我。
由于
答案 0 :(得分:2)
这与任何形式的Yii无关。
&#34;无效代码&#34;如果将 User CSS 包含在外部文件中,则可以轻松删除示例中提供的内容。
这不是他们用CSS做的全部。您应手动删除以下条目:
behavior: url( .. )
!important
的所有实例#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" />
)而不是内联样式块加载此样式,这样就无法突破。