2016-11-04 42 views
-2
<input type="text" id="search" value=" &amp; "> 

當加載頁面輸入將顯示&(這是很好)爲什麼jQuery的.VAL()不編碼&到&

但是,如果我使用jQuery來更新我的輸入值,可以說:

$("#search").val(" &amp; ");輸入會告訴我&amp;(但我想說明&(但在後面仍然編碼爲&amp;,像第一個例子))

什麼我在想念這裏?

+2

顯示哪裏?它不會對它進行解碼,因爲您輸入的值不是'&'它是'&'。這對我來說似乎是非常正確的行爲。你的問題真的不是很清楚嗎? – Liam

+0

HTML文件內的'&'在瀏覽器的HTML解析器到達渲染引擎之前已經被解碼。這是XML/HTML的一部分。 JavaScript文件沒有這樣的解碼發生。 (可能有嵌入HTML的JavaScript代碼片段)。 – Thilo

+0

我使用自動完成,我使用htmlspecialchars ecnode我的數據並返回自動完成,可以說我會返回A & D公司,我想我的輸入填充與A和D(但值應該是A & D) –

回答

1

你不能僅靠保護自己免受瀏覽器中有害的用戶編碼來保護自己免受XSS攻擊。即使沒有瀏覽器,我也可以向您發送有害請求。在存儲用戶數據或生成html時,您需要保護自己免受服務器端的XSS攻擊,具體取決於您的方法。

這是一個PHP函數,你可以保護自己免受此類攻擊:當它要保證生成的HTML是安全

public static function protectArrayAgainstXSS(&$arr) { 
    $changed = false; 
    foreach ($arr as $index => $a) { 
     if (is_array($a)) { 
      $changed = $changed || Common::protectArrayAgainstXSS($arr[$index]); 
     } else if ($a !== null) { 
      $changed = $changed || ($arr[$index] === strip_tags($a)); 
      $arr[$index] = strip_tags($a); 
     } 
    } 
    return !$changed; 
} 

您的代碼應該運行此。

至於你關於jQuery的問題:.val()不應該處理你想要的。如果你想編碼解碼的東西,你可以做這樣的事情:

function htmlEncode(value){ 
    //create a in-memory div, set it's inner text(which jQuery automatically encodes) 
    //then grab the encoded contents back out. The div never exists on the page. 
    return $('<div/>').text(value).html(); 
} 

function htmlDecode(value){ 
    return $('<div/>').html(value).text(); 
} 

function myVal(context, v) { 
    return v ? context.val(htmlEncode(v)) : htmlDecode(context.val()); 
} 

Source

但是,只要你需要保護,你需要在服務器端有一個保護。您可以保護您的客戶端以及XSS輸入,但這是可選的。

相關問題