我有一个输入,它在页面的一个框中显示一个值(Firstname)。在服务器端,通过以下规则(vb.net)转义输入:
Public Function UnescapeString(strValue As String) As String
If (String.IsNullOrEmpty(strValue)) Then Return strValue
strValue = Replace$(strValue, """", "")
strValue = Replace$(strValue, "'", "")
strValue = Replace$(strValue, "<", "")
strValue = Replace$(strValue, ">", "")
Return strValue
End Function输出完全没有验证。
我不敢相信逃离<>的输入会如此安全,就像我觉得的那样!?
是否存在注入代码的窍门,或者是防止XSS在这里、切断或逃避<>标记的最主要的东西?
问题2:我计划像这样重写这个方法:
strValue = Replace$(strValue, """", """)
strValue = Replace$(strValue, "<", "<")
strValue = Replace$(strValue, ">", ">")
strValue = Replace$(strValue, "&", "&")
strValue = Replace$(strValue, "'", "'")
strValue = Replace$(strValue, "/", "/")
strValue = System.Web.HttpUtility.HtmlEncode(strValue) <- or only this我计划不删减,而是正确地转义值,如上面的示例所示。或者我只使用.NET的HtmlEncode (最后一行),它甚至编码特殊字符,如德国货币,以及危险的标志,如<>"'/。
发布于 2018-09-07 13:37:39
问题是,您可以使用其他编码(如base64 )来创建一个成功的XSS,而不是使用HttpContext.Current.Server.HtmlEncode()。
示例:
$ echo '' | base64
PHNjcmlwdD4K
$echo PHNjcmlwdD4K | base64 -D
<script></code></pre><div>Javascript示例:</div><pre><code> var decodedData=window.atob('PGlmcmFtZSBzcmM9L3hzcy9iYXNlLmh0bWwgd2lkdGg9MTAwJSBoZWlnaHQ9MTAwJT48L2lmcmFtZT4K');
document.write(decodedData);</code></pre><div>如果是这样的例子:</div><pre><code>src=data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4K</code></pre><div>另外,您可能不会在代码的生命周期内维护这段代码,一个新的漏洞可能会绕过您的过滤器,希望.NET的维护人员能够发布一个更新,以解决这个问题,并由sys应用。</div>https://security.stackexchange.com/questions/193231
复制相似问题