2012-01-05 325 views
36

我一定要逃逸JavaScript函數參數單引號,以避免這種情況:單引號逃逸參數

onclick="Javascript:INSERT_PRODUCT('188267','WILL AND GRACE','32311','L'ANNIVERSARIO DINOZZE ','20101113|04|18|','13/11/2010 0.00.00','CANALE 5 ',this);" 

但我需要轉義函數調用裏面,因爲我不知道會值被傳遞(我無法從數據庫中轉義的數據庫變量)。

是否有一個函數允許我做類似下面的事情?

onclick="Javascript:function(escape(param1), escape(param2), escape(param3));" 
+3

' ''='\''(就像你一個正常的字符串)。而且因爲你將它插入到標記中,所以_you_需要轉義它,或者如果服務器端語言正在生成它,請確保_it_轉義它。 – 2012-01-05 14:42:44

+0

你可以把你的參數放在'escape(參數)' – 2012-01-05 14:44:04

+4

那裏不需要標籤'Javascript:'。您應該使用其他方式綁定事件處理程序:http://www.quirksmode.org/js/introevents.html,那麼您不必擔心引號。 – 2012-01-05 14:44:20

回答

9

逃脫撇號用反斜槓:

onclick="INSERT_PRODUCT('188267','WILL AND GRACE ','32311','L\'ANNIVERSARIO DI NOZZE ','20101113|04|18|','13/11/2010 0.00.00','CANALE 5 ',this);" 
+4

請刪除'的JavaScript:'。把它放在那裏並沒有錯,但它也是沒有用的,經驗較少的開發者可能認爲它是需要的。 – 2012-01-05 14:52:01

+2

我需要一個函數來執行myfunction調用中的轉義,因爲這是我可以訪問的唯一地方。任何建議? – 2012-01-05 14:57:35

+0

如果字符串包含''','','\'或任何其他編碼單引號或雙引號或反斜槓的實體,則這將失敗。例如,字符串''foo'onmouseover = alert(1)'包含no單引號,但是當嵌入到HTML屬性中時,會利用XSS漏洞。同樣,'foo \'也會失敗,因爲JavaScript解析器將會看到'\',而不是'\',所以close quote會被解釋爲字符串的一部分,所以如果下一個字符串值是'alert(1))/ /',那麼這將被視爲文字JavaScript,導致任意腳本執行。 – 2014-12-23 16:26:44

18
JSON.stringify(plainTextStr).replace(/&/, "&").replace(/"/g, """) 

會產生你可以在一個引號中的屬性安全嵌入一個字符串,當通過JavaScript解釋器看到,這將具有相同的含義。

唯一要注意的是,一些Unicode換行符(U + 2028和U + 2029)need to be escaped之前被嵌入在JavaScript字符串常量,但JSON只要求\r\n轉義。

0

如果我正確地理解了你,我不相信你正在努力做什麼是可能的。您將需要在服務器端轉義引號。任何可能爲你引用的函數本身都是一個函數,它需要一個有效的字符串,這意味着在傳遞給函數之前它需要被轉義。

7

這可能不是完全清楚的問題,但假設你只想將這個發送到一個PHP腳本以存儲在數據庫中,那麼你當然會理想地使用PHP的各種方法,例如stripslashes() - 但是如果你實際上並不想太花哨,只需在任何單引號之前添加1個斜線就足以將SQL查詢從客戶端發送到PHP。這是不安全,但也許不是必要的。

str.replace(/'/g, "\\'"); // escaping \ with \, so used 2x 

的伎倆,例如像在這樣的事情:

var body = $('#body').val().replace(/'/g, "\\'"); 
myCustomSQLqueryFunction("UPDATE mytable SET `content`='"+ body +"';"); 

的MySQL現在存儲您body就像你在表單字段中看到它。

+0

我正在測試這個,並注意到MySQL簡單地刪除了像''所以你必須逃避那些花式單引號。 – tim 2013-02-07 01:29:34

3

此功能爲我工作(它移除並重新恢復報價): 猜測要發送的數據是輸入元素的值,

var Url = encodeURIComponent($('#userInput').val().replace("'","\\'")); 

然後再得到原文:

var originalText = decodeURIComponent(Url); 
1
var cmpdetail = cmpdetail.replace(/'/g, "\\'"); 

它爲我工作。

0

我更喜歡用單引號來定義JavaScript字符串。然後,我按照以下方式逃避嵌入的雙引號。

這就是我該怎麼做,基本上str.replace(/[\""]/g, '\\"')

var display = document.getElementById('output'); 
 
var str = 'class="whatever-foo__input" id="node-key"'; 
 
display.innerHTML = str.replace(/[\""]/g, '\\"'); 
 

 
//will return class=\"whatever-foo__input\" id=\"node-key\"
<span id="output"></span>