我有div
,它会从用户选择的网址接收CSS背景图片,如下所示:
background-image: url("/* user specified URL here*/")
我应该如何转义网址,以便安全地嵌入CSS?是否足以逃避报价?
答案 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。