我该如何转义CSS的图片网址?

时间:2014-09-01 22:24:23

标签: css url escaping xss

我有div,它会从用户选择的网址接收CSS背景图片,如下所示:

background-image: url("/* user specified URL here*/")

我应该如何转义网址,以便安全地嵌入CSS?是否足以逃避报价?

3 个答案:

答案 0 :(得分:9)

如果您通过JS设置后台URL,那么正确且安全的方法是使用encodeURI()并用引号括起来。

node.style.backgroundImage = 'url("' + encodeURI(url) + '")';

答案 1 :(得分:2)

  

是否足以逃避报价?

不,你也应该担心反斜杠和换行符。

以下是双引号URI的CSS语法: http://www.w3.org/TR/CSS21/grammar.html#scanner

"([^\n\r\f\\"]|\\{nl}|{escape})"

其中{nl}

\n|\r\n|\r|\f

{escape}是一个反斜杠转义的字符。所以一个尾随反斜杠会破坏你的CSS。同样也是一个未转义的换行符。

我强烈建议删除所有空格,最后转义"\

答案 2 :(得分:0)

由于您需要插入CSS的用户数据可以被视为URL,而不仅仅是字符串,您只需要确保它是正确的URL编码。

这是安全的,因为格式良好的URL不包含CSS字符串中不安全的任何字符;除了撇号(public class GlassActionListener{ JButton first; JButton second; @Override public void actionPerformed(ActionEvent e) { if(first == null) { first = (JButton) e.getSource(); } else { second = (JButton) e.getSource(); // do something // clean up first = null; second = null; } } } public class GUIControl { public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { showGUI(); } }); } public static void showGUI() { JFrame frame = new JFrame("MyFrame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); JButton glass1 = new JButton("glass1"); JButton glass2 = new JButton("glass2"); JButton glass3 = new JButton("glass3"); frame.getContentPane().add(glass1); frame.getContentPane().add(glass2); frame.getContentPane().add(glass3); frame.pack(); frame.setVisible(true); glass1.addActionListener(??); glass2.addActionListener(??); glass3.addActionListener(??); // I want to store the first two clicks in these variables from = "glassX"; to = "glassY"; puzzle.move(from, to); } )之外,只要你为CSS字符串使用双引号就不会有问题:'

一种简单的方法是对所有不是"保留"的所有字符进行URL编码。或者"毫无保留的"在URL中。根据{{​​3}},除了这些之外,这将是所有字符:

url("...")

这是RFC 3986 encodeURI()所做的事情。 (有一个例外:A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) # [ ] encodeURI()[进行编码,这几乎无关紧要。)

除此之外,您可以考虑仅允许以]https:开头的网址。通过执行此操作,如果页面通过HTTPS提供,则可以阻止Mārtiņš Briedis's JavaScript answer,并且还可以避免data:问题mixed content warnings

您可能需要进行其他网址解析和验证,但这超出了此问题的范围。

如果您需要将用户数据插入到不能被视为URL的CSS字符串中,那么您需要执行Alexander O'Mara commented on。有关详情,请参阅CSS backslash escaping