我正在网站上工作,用户可以创建自定义CSS样式表。我知道这将永远存在危险,但是有什么办法可以让我的验证更安全吗?我正在使用这个:
$customCSS = $_POST["submittedCustomCSS"]; //put user's submitted stylesheet into variable
$customCSS = htmlspecialchars($customCSS); //hopefully validate it?
file_put_contents("../custom.css", $customCSS); //save user's stylesheet
自定义CSS显示的页面启用了PHP,CSS通过<link rel="stylesheet" href="<?php echo $postID; ?>/custom.css">
显示
有没有办法让这更安全?提前致谢! :)
答案 0 :(得分:2)
htmlspecialchars($customCSS); //hopefully validate it?
不,这还不够。这可能会阻止CSS转义嵌入它的</style>
元素,但不会阻止CSS在页面上设置任意元素的样式,也不会阻止加载自定义字体或滥用CSS安全性的其他有问题的功能影响仍然知之甚少。
如果自定义样式表可以应用于作者无法访问的任何页面,那么您需要比此更严格。有一些方法可以利用自定义样式表来窃取不需要运行JS的信用卡号或XSRF令牌等数据。
例如,如果一个用户可以选择使用其他用户的自定义样式表,那么这可能会导致安全漏洞,并且您不应要求用户能够阅读和审核CSS文件以安全地使用您网站的功能
"Scriptless Attacks – Stealing the Pie Without Touching the Sill"解释了注入CSS的一些方法可能会有问题:
我们展示了CSS标记,传统上认为它只是 用于装饰/显示目的,实际上是一个 攻击者进行恶意活动。
...
我们介绍几种我们称之为的新型攻击 无脚本攻击,因为攻击者可以获得信用卡 通过在不依赖的情况下将标记注入此页面来编号 任何类型的(JavaScript)代码执行。
...
所讨论的攻击都不依赖于用户交互 在受害者的角色,但使用良好的HTML,CSS的混合 和Web Open字体格式(WOFF [23])功能相结合 使用基于HTTP请求的侧通道进行测量和检测 在网站上显示几乎任意的数据。
答案 1 :(得分:0)
由于Microsoft将CSS表达式添加为Internet Explorer的专有扩展,因此安全地处理不受信任的CSS比简单地正确编码它更复杂。要正确执行此操作,您需要解析CSS然后只输出与白名单匹配的内容。除非你这样做,否则将JavaScript注入到Internet Explorer访问者的页面中是微不足道的。
另一种方法是只接受有效的CSS,但是我担心微软可能会试图在评论中偷偷摸摸某些内容,或者像使用HTML一样。