轻量且安全的方式来防止XSS

时间:2011-05-29 22:04:21

标签: php mysql xss cassandra user-input

此当前项目中的每个文本字段都只是普通的平面文本,没有ubb或html标记。 但是它必须是unicode,因此支持的字符数组不是最佳的。

我知道有很多用于xss检测的专用类,但是并非所有xss都包含这两个字符:

char<

<
%3C
&lt
&#60;
&60;
&#x3C;
PA==

char;

;
%3B
&#x3B;
&#59
Ow==
&59;

如果我检查上面代码块中所有字符的所有用户输入(get,post,cookie),那么一切都应该100%安全吗? 该项目没有在mysql上运行,它使用cassandra所以mysql注入应该不是问题。

我确定我忘记了什么,但我不知道是什么...... 或者,当用户输入是平面文本时,构建100%安全的应用程序真的很容易吗?

编辑: List更长一点,在这里找到第一个char的一个: http://ha.ckers.org/xss.html

 <
    %3C
    &lt
    &lt;
    &LT
    &LT;
    &#60
    &#060
    &#0060
    &#00060
    &#000060
    &#0000060
    &#60;
    &#060;
    &#0060;
    &#00060;
    &#000060;
    &#0000060;
    &#x3c
    &#x03c
    &#x003c
    &#x0003c
    &#x00003c
    &#x000003c
    &#x3c;
    &#x03c;
    &#x003c;
    &#x0003c;
    &#x00003c;
    &#x000003c;
    &#X3c
    &#X03c
    &#X003c
    &#X0003c
    &#X00003c
    &#X000003c
    &#X3c;
    &#X03c;
    &#X003c;
    &#X0003c;
    &#X00003c;
    &#X000003c;
    &#x3C
    &#x03C
    &#x003C
    &#x0003C
    &#x00003C
    &#x000003C
    &#x3C;
    &#x03C;
    &#x003C;
    &#x0003C;
    &#x00003C;
    &#x000003C;
    &#X3C
    &#X03C
    &#X003C
    &#X0003C
    &#X00003C
    &#X000003C
    &#X3C;
    &#X03C;
    &#X003C;
    &#X0003C;
    &#X00003C;
    &#X000003C;
    \x3c
    \x3C
    \u003c
    \u003C

2 个答案:

答案 0 :(得分:2)

没有必要试图在输入中禁止“邪恶”字符,更不用说试图禁止以各种不同形式编码的版本。您将误报并阻止有效输入,同时不保护自己免受各种可能形式的注入孔的影响。我不确定您试图通过禁止Ow== 来阻止哪种攻击,而不是&"

停止HTML注入的正确方法是在输出到HTML页面的任何文本字符串上调用htmlspecialchars()。停止URL组件注入的正确方法是在输出到URL的文本字符串上调用rawurlencode()。停止SQL注入的正确方法是在输出到SQL字符串文字的任何文本上调用相关的DB转义函数(例如mysql_real_escape_chars())。

等等,对于逃避的每一个不同,你可能会遇到。关键是,这是一个输出级函数,必须在将文本放入新上下文时使用,使用正确的函数作为您拥有的上下文类型。这不是你在输入阶段可以做的事情然后忘记了,因为你在输入阶段不知道你正在处理的文本是否会以SQL文字,HTML页面,JavaScript字符串结尾文字,URL参数或什么。

这并不是说输入阶段验证是无用的;你会希望它确保一个应该是数字的提交字段实际上看起来像一个数字,或一个日期,或者其他什么。但输入验证不是输出转移问题的解决方案,例如导致大多数XSS的HTML注入问题。要做到这一点,你必须禁止几乎所有标点符号,这将是非常用户敌意。

答案 1 :(得分:1)

  

然而,并非所有xss都包括这两个字符:( ...)[&lt;和&amp;]

不,他们没有...因为您链接的cheat sheet会提示。例如(MG Embedded命令第二部分)

Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser
  

当用户输入是平面文本时,构建100%安全的应用程序真的很容易吗?

让我们说它更简单。你仍然需要担心SQL注入,XSS(它的数量较少,但是it's still potentially around只有一点点不正确的数据转义)和CSRF。