2012-09-07 49 views
2

我需要在頁面上插入來自使用jQuery的$.html()輸入文本區域到另一個div客戶創建內容的實時預覽功能如何使用jQuery的.html()時,能夠防止JavaScript執行

但是,如果客戶輸入的JavaScript裏面的內容,如:

<script type='text/javascript'> 
alert('abc'); 
</script> 

調用此與.html()時,JavaScript將得到執行,如果我用.text(),則內容將不被視爲HTML。

我該如何解決這個問題?我爲它創建了一個jsfiddle:http://jsfiddle.net/larryzhao/VL82f/

更新: 也許我需要更清楚一點,我正在預覽降價。因此,用戶在textarea上輸入markdown,然後轉換爲html,並將其顯示到div#dest。如果用戶輸入上面顯示的腳本,該怎麼辦?有沒有辦法保持原始類型,但不執行它?如果不是,那麼我想我會只寫一個正則表達式來擦拭腳本阻擋我想..

我發現了兩個在網上降價的工具: http://daringfireball.net/projects/markdown/dingus這一個執行它 http://www.ctrlshift.net/project/markdowneditor/這一個剛擦的腳本塊out

+0

didnt此幫助:: HTTP://計算器。com/questions/11373703/prevent-javascript-execution-in-jquery-html –

+0

你想讓JavaScript執行或者不執行?您必須創建一個正則表達式才能在預覽中插入

1

是否有JavaScript的HTML消毒器?如果是這樣,這是做到這一點的方法。作爲一個說明,這是非常容易做正確,所以一個天真的正則表達式通常是不夠的。如果您通過應用程序將其保存在某個位置,則預覽功能可以通過發佈並獲取清理後的版本來利用該清潔劑。

-1

你將不得不創建一個正則表達式來預覽未插入<script>

<script (.|\n)*?>(.|\n)*?</script>

或嘗試:

function stripScripts(s) { 
    var div = document.createElement('div'); 
    div.innerHTML = s; 
    var scripts = div.getElementsByTagName('script'); 
    var i = scripts.length; 
    while (i--) { 
    scripts[i].parentNode.removeChild(scripts[i]); 
    } 
    return div.innerHTML; 
} 

alert(
    stripScripts('<span><script type="text/javascript">alert(\'foo\');<\/script><\/span>') 
); 
+0

爲什麼是反面投票? –

1

你可以成才別人,這樣更換腳本標記你只能看到預覽值警報次數,如:

$(document).ready(function() { 
    $('#source').on('keydown', function(){ 
     var content = ($(this).val()).replace(/(<\s*\/?\s*)script(\s*([^>]*)?\s*>)/gi ,'$1jscript$2') 
     console.log(content); 
     $("#dest").html(content); 
    }); 
}); 

請參閱:jsFiddle

+0

這有副作用。如果輸入'我愛javascript.',那麼將'我愛javajscript.' – xdazz

+0

@xdazz謝謝你的信息,取代了替換的東西,它應該工作,即使當字符串包含腳本 –

+0

我可以知道爲什麼downvote ..? –

0

您可以清理用戶輸入,刪除xss。

node-validator

+0

我不確定如何使用它,但是當我在github中搜索JavaScript函數庫時,我發現它有'function xss_clean('。 – Prasanth

1

如果用戶在客戶端上輸入住宿的文本,然後爲什麼,如果用戶想自己XSS事?如果文本回到服務器,那麼你在那裏清理它,這樣如果其他用戶看到輸入,他們將看到一個清理的輸入。

相關問題