Changeset 7329

Show
Ignore:
Timestamp:
03/01/08 19:16:07 (5 years ago)
Author:
drry
Message:

lang/javascript/userscripts/googlereaderfullfeed.user.js:

  • removeXSSRisk() を改良しました。
    • ほかのパターンが有り得るかもしれないのでまだ考える必要があります。
      • まるごと諦めて除去してしまう。
      • ホワイトリスト方式。
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/javascript/userscripts/googlereaderfullfeed.user.js

    r7281 r7329  
    103103  var text = res.responseText; 
    104104 
    105   text = removeXSSRisk(text); 
     105  text = removeXSSRisks(text); 
    106106  if (REMOVE_SCRIPT) text = text.replace(/<script[^>]*>[\S\s]*?<\/script\s*>/gi, ""); 
    107107  if (REMOVE_H2TAG)  text = text.replace(/<h2[^>]*>[\S\s]*?<\/h2\s*>/gi, ""); 
     
    446446 
    447447// == [Utility] ===================================================== 
    448 function removeXSSRisk(text) { 
    449   var reg = /always/ig; 
    450   //embedによるXSSの対策処理 
    451   text = text.replace(/(<\s*?embed[^<>]*?allowScriptAccess\s*?=\s*?["'])([^"']*?)(["'][^<>]*?>)/ig, function(match, l, val, r) { 
    452     if (reg.test(val)) { 
    453       return l + "never" + r; 
    454     } else { 
    455       return match; 
    456     } 
    457   }); 
    458   //objectのparam要素によるXSSの対策処理 
    459   text = text.replace(/(<\s*?param[^<>]*?name\s*?=\s*?["']\s*?allowScriptAccess[^"']*?["'][^<>]*?value\s*?=\s*?["']\s*?)([^"']*?)(["'][^<>]*?\/>)/ig, function(match, l, val, r) { 
    460     if (reg.test(val)) { 
    461       return l + "never" + r; 
    462     } else { 
    463       return match; 
    464     } 
    465   }); 
    466   //イベントハンドラによるXSSの対策処理 
    467   text = text.replace(/(<[^>]*?)(on(load|unload|click|dblclick|mousedown|mouseup|mouseover|mouseout|mousemove|keypress)\s*?=\s*?["'][^"']*?["'])/ig, function(match, l, handler, val) { 
    468     return l; 
    469   }); 
    470   return text; 
     448function removeXSSRisks(text) { 
     449  // <embed allowScriptAccess="always"><object onload =alert(this) ><param value= 'always' name = " allowScriptAccess "/></object> 
     450  // <embed allowScriptAccess="never"><object ><param value= 'never' name = " allowScriptAccess "/></object> 
     451  return text 
     452  // embedによるXSSの対策処理 
     453    .replace(/(<embed[^>]+?allowScriptAccess\s*=\s*)(?:(["'])\s*always\s*\2|always)(?=[^>]*?>)/gi, "$1$2never$2") 
     454  // objectのparam要素によるXSSの対策処理 
     455    .replace(/(<param[^>]+?)(?:(name\s*=\s*(?:(["'])\s*allowScriptAccess\s*\3|allowScriptAccess\s)[^>]*?value\s*=\s*)(?:(["'])\s*always\s*\4|always)(?=[^>]*?\/?>)|(value\s*=\s*)(?:(["'])\s*always\s*\6|always)(?=[^>]*?name\s*=\s*(?:(["'])\s*allowScriptAccess\s*\7|allowScriptAccess)[^>]*?\/?>))/gi, "$1$2$5$4$6never$4$6") 
     456  // イベントハンドラによるXSSの対策処理 
     457    .replace(/(<[^>]+?)\son(?:(?:un)?load|(?:dbl)?click|mouse(?:down|up|over|move|out)|key(?:press|down|up)|focus|blur|submit|reset|select|change)\s*=\s*(?:(["'])(?:\\\2|[^"'])*?\2|[^"'][^\s>]*(?=[\s>]))(?=[^>]*?>)/ig, "$1"); 
    471458} 
    472459 
     
    513500      text-align : center; 
    514501    } 
    515   ]]></>); 
     502  ]]></>.toString().replace(/^\s{4}/gm, "")); 
    516503  var opacity = 0.9; 
    517504  var flash = document.createElement('div');