2014-09-01 42 views
3

我有一個div將從用戶選擇的URL收到一個CSS背景圖像,就像這樣:我應該如何轉義CSS的圖片網址?

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

我應如何躲避URL,以便它的安全在CSS中嵌入?足夠逃脫報價了嗎?

+0

您可能還需要URLENCODE它(將空格轉換爲%20等) – 2014-09-01 22:27:26

+1

@SetSailMedia使用像urlencode這樣的函數對整個URL進行編碼將會破壞URL。 – 2014-09-01 22:31:04

+0

@ AlexanderO'Mara好點!猜測OP將不得不使用一些智能過濾,然後:) – 2014-09-01 22:33:02

回答

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。非轉義的換行符也是如此。

我會強烈建議移除所有的空格,最後逃脫"\

4

如果通過JS設置背景的URL,那麼正確的和安全的方式是使用是encodeURI()和包裝的報價。

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

這個答案的廣義的非JS版本是爲了逃避CSS的URL,你只需要URL編碼('''''>'%22')既不是「保留」也不是「保留」的字符在URLs中([RFC 3986](https://tools.ietf.org/html/rfc3986))。這就是'encodeURI()'的作用。這是因爲格式良好的URL不包含任何不安全的字符CSS字符串,除了撇號('''),這就是爲什麼你應該爲你的CSS字符串使用雙引號('「')。它不會破壞一開始就沒有被破解的URL。 – 2017-10-07 01:38:06

0

因爲你需要插入到CSS的用戶數據可以通過URL來處理,而不是隻是一個字符串,你只需要確保它是正確的URL編碼。

這是安全的,因爲格式良好的URL不包含CSS字符串中不安全的任何字符;除了撇號('),它只要你使用雙引號爲你的CSS字符串不是一個問題:url("...")

一個簡單的方法做,這是URL編碼沒有被「保留」的所有字符或者「毫無保留「的網址。據RFC 3986,這將是所有字符,除了這些:

A-Z a-z 0-9 ; ,/? : @ & = + $ - _ . ! ~ * ' () # [ ] 

這就是encodeURI()確實在Mārtiņš Briedis's JavaScript answer。 (有一個例外:encodeURI()編碼[],其中大部分是無關緊要的)

除此之外,你可能只考慮與https:data:開始允許的網址。通過這樣做,如果通過HTTPS提供頁面,則可以防止mixed content warnings,並且還可以避免javascript:問題Alexander O'Mara commented on

您可能會進行其他URL解析和驗證,但這不在此問題的範圍之內。

如果您需要將用戶數據插入不能像URL那樣處理的CSS字符串,那麼您需要執行CSS backslash escaping。有關更多信息,請參閱user123444555621's answer