在纯文本和HTML中筛选XSS


Filter XSS in plain text and HTML

我有自己的函数xss,它返回已清理的文本。我想知道,如果这是足够的,或者我有一些错误那里

function xss($str,$html = false)
{
  if($html){
    //HTML Purfier called here
  }else{
    return str_replace(array('&','"',"'",'<','>'), array('&amp;','&quot;','&#39;','&lt;','&gt;'), $str);
  }
}

我不想使用strip_tag,因为它会删除所有标签。我想离开它们,但替换为保存实体。替换这些字符时是否保存?

您应该考虑一些可能有问题的其他字符。例如":"answers";"。想象一下,您返回标记属性(如href)中的文本,然后攻击者可以使用类似"http://yoursite.com/blah/?parameter=javascript:alert(String.fromCharCode(65))',这将反映为:

...
<a href="javascript:alert(String.fromCharCode(65))">
...

或者他可以用";"如果脚本中反映了任何内容,则在其中开始一行新行。尽量覆盖所有可能存在问题的字符。