Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 白名单,在C中使用WMD控件防止XSS#_C#_Asp.net_Xss_Wmd_Whitelist - Fatal编程技术网

C# 白名单,在C中使用WMD控件防止XSS#

C# 白名单,在C中使用WMD控件防止XSS#,c#,asp.net,xss,wmd,whitelist,C#,Asp.net,Xss,Wmd,Whitelist,我在这里的工作有什么问题吗?这是我第一次处理这样的事情,我只是想确保我了解不同方法的所有风险等 我使用WMD获取用户输入,并使用文字控件显示它。 因为一旦输入就不可编辑,所以我将存储HTML而不是降价 input = Server.HTMLEncode(stringThatComesFromWMDTextArea) 然后对我希望用户能够使用的标记运行类似以下的操作 // Unescape whitelisted tags. string output = input.Replace("&

我在这里的工作有什么问题吗?这是我第一次处理这样的事情,我只是想确保我了解不同方法的所有风险等

我使用WMD获取用户输入,并使用文字控件显示它。 因为一旦输入就不可编辑,所以我将存储HTML而不是降价

input = Server.HTMLEncode(stringThatComesFromWMDTextArea)
然后对我希望用户能够使用的标记运行类似以下的操作

// Unescape whitelisted tags.
string output = input.Replace("&lt;b&gt;", "<b>").Replace("&lt;/b&gt;", "</b>")
                     .Replace("&lt;i&gt;", "<i>").Replace("&lt;/i&gt;", "</i>");
//Unescape白名单标记。
字符串输出=输入。替换(“b”和“”)。替换(“/b”和“”)
.Replace(“i”,“i”)。Replace(“/i”,“i”);
编辑以下是我目前正在做的事情:

 public static string EncodeAndWhitelist(string html)
 {
     string[] whiteList = { "b", "i", "strong", "img", "ul", "li" };
     string encodedHTML = HttpUtility.HtmlEncode(html);
     foreach (string wl in whiteList)
         encodedHTML = encodedHTML.Replace("&lt;" + wl + "&gt;", "<" + wl + ">").Replace("&lt;/" + wl + "&gt;", "</" + wl + ">");
     return encodedHTML;
 }
publicstaticstringencodeandwhitelist(字符串html)
{
字符串[]白名单={“b”,“i”,“strong”,“img”,“ul”,“li”};
字符串encodedHTML=HttpUtility.HtmlEncode(html);
foreach(白名单中的字符串wl)
encodedHTML=encodedHTML.Replace(“+wl+”,”).Replace(“/”+wl+”,”);
返回编码DHTML;
}
  • 我在这里做的事能保护我不受伤害吗
  • 还有其他考虑吗 应该这样做吗
  • 有没有一个很好的正常工作清单 白名单上的标签

  • 如果您的需求真的那么基本,您可以进行简单的字符串替换,那么是的,这对XSS是“安全的”。(但是,如果
    嵌套错误或未关闭,仍然可以提交格式不正确的内容,这可能会导致插入内容的页面混乱。)

    但这还远远不够。例如,当前不允许使用
    。如果您想允许在中使用这些或其他带有属性值的标记,则需要做大量的工作。然后,您可能会使用regex进行处理,但这会给您带来无数的问题,比如意外嵌套和替换已经替换的内容,比如regex无法解析HTML等等


    为了解决这两个问题,通常的方法是对输入使用[X][HT]ML解析器,然后遍历DOM除去所有已知良好的元素和属性,最后重新序列化为[X]HTML。然后保证结果格式正确且仅包含安全内容。

    该代码不适用于“IMG”标记,因为替换“IMG”不允许使用“src”属性“。那么,假设我想要更健壮的东西,你会对你提到的解析器提出什么建议?HTML Agility Pack可以处理吗?是的,HTML敏捷包是一个不错的选择。解析DOM之后,编写一个递归函数,从DOM树中删除除已知良好元素/属性外的所有元素/属性,这是一个相对简单的练习。另外,如果您允许
    href
    /
    src
    /等,请记住检查URL以查找已知的好方案,如
    http
    /
    https
    ,以避免通过
    javascript:
    URL等进行注入。