首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是XDocument代码安全吗?

这是XDocument代码安全吗?
EN

Stack Overflow用户
提问于 2011-02-24 21:47:03
回答 2查看 1.1K关注 0票数 1

我正在编写一个名为类别的类,它包含两个静态方法,用于从外部资源中提取XML数据。在下面的例子中,我只会展示一个,因为它们非常相似。

我想弄清楚的是,这段代码在无效URL、无效数据等方面是否“安全”。基本上能让它更强壮。,这是代码

代码语言:javascript
复制
private static string XmlUri
    {
        get { return "path-to-xml-file"; }
    }
private static XDocument XmlFile { get; set; }
public int ID { get; set; }
public string Name { get; set; }
public int Parent { get; set; }

/// <summary>
/// Gets a specific category
/// </summary>
/// <param name="id"></param>
/// <returns>A Category with the specified ID</returns>
public static Category Get(int id)
{
    try
    {
        if (XmlFile == null)
            XmlFile = XDocument.Load(XmlUri);
    }
    // Invalid URL or data
    catch (Exception ex)
    {

        // TODO: Log exception
        Console.WriteLine(ex.Message);
    }

    if (XmlFile == null)
        return null;

    var cat = from category in XmlFile.Descendants("Category")
               where category.Attribute("id").Value.ParseSafe() == id
               select new Category
               {
                   ID = category.Attribute("id").Value.ParseSafe(),
                   Parent = category.Attribute("parent").Value.ParseSafe(),
                   Name = category.Value
               };

    return cat.SingleOrDefault();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-24 22:09:19

定义“安全”。当出现问题时,您的代码将生成null。我会考虑(重新)在XDocument.Load()之后添加catch块。为了在中安全起见,不要忽略无效的

这也给ParseSafe()和SingleOrDefault带来了疑问。如果id丢失或格式错误,您想要发生什么?

还有,一个小小的改进:您可以将按需负载逻辑放入XmlFile的getter中。如果你还想要类别之外的其他元素,那就更容易了。

票数 2
EN

Stack Overflow用户

发布于 2011-02-24 22:11:32

不像ChaosPandion提到的线程安全。

混淆性能行为- Get(int)看起来像是简单的快速方法,但实际上涉及到一些重要的工作。使用延迟初始化,并将整个类别集合逐个读入字典。

不应该捕获异常并吞下它--要么使用特定的异常(在本例中我认为是IOException和XMLExcepetion ),要么至少允许正常抛出致命的异常。

显然,如果您不控制XML文件,那么在加载异常大的文件时,它也会导致缓慢/挂起。取决于读取器的行为和XML的复杂性(如果由恶意方提供给您)可能会导致其他一些异常,如StackOverflow杀死您的进程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5110884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档