小编jun*_*omo的帖子

如何防止XXE攻击(.net中的XmlDocument)

我们对代码进行了安全审核,他们提到我们的代码容易受到外部实体(XXE)攻击.我正在使用以下代码 -

string OurOutputXMLString=
"<ce><input><transaction><length>00000</length><tran_type>Login</tran_type></transaction><user><user_id>ce_userid</user_id><subscriber_name>ce_subscribername</subscriber_name><subscriber_id>ce_subscriberid</subscriber_id><group_id>ce_groupid</group_id><permissions></permissions></user><consumer><login_details><username>UnitTester9</username><password>pDhE5AsKBHw85Sqgg6qdKQ==</password><pin>tOlkiae9epM=</pin></login_details></consumer></input></ce>"

 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.LoadXml(OurOutputXMLString);
Run Code Online (Sandbox Code Playgroud)

在审计报告中,他们说它失败了,因为XML实体可以包含可以在预期的控制之外解析的URL.XML实体解析器将尝试解析和检索外部引用.如果可以将攻击者控制的XML提交给其中一个功能,则攻击者可以访问有关内部网络,本地文件系统或其他敏感数据的信息.为了避免这种情况,我编写了以下代码,但它不起作用.

MemoryStream stream =
    new MemoryStream(System.Text.Encoding.Default.GetBytes(OurOutputXMLString));

XmlReaderSettings settings = new XmlReaderSettings();

settings.DtdProcessing = DtdProcessing.Prohibit;
settings.MaxCharactersFromEntities = 6000;
XmlReader reader = XmlReader.Create(stream, settings);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(reader);
Run Code Online (Sandbox Code Playgroud)

但我可以在这里看到,读者没有任何值加载到xmlDoc(XmlDocument).任何人都可以帮我错过的地方吗?任何帮助表示赞赏!

.net c# xml asp.net xml-parsing

29
推荐指数
2
解决办法
3万
查看次数

foreach in C++ int array

我是C++的新手,我正在编写以下代码.我需要遍历调用函数中的所有插件 - testFunction.我知道这在C#中有效,但是这段代码不起作用.任何人都可以指出在C++中正确的方法吗?

#include "stdafx.h"
#include <iostream>
#include "resource.h"

int testFunction(char* tester);
int _tmain()
{
    int mainProd=2;
    int Addons[]={7,8,9,10};

    testFunction(mainProd,Addons);


}
void testFunction(int mainProd,int addons[])
{
    for(int x = 0 ; addons.length;++x) ---- Not working 
    {
        std::cout<< addons[x];
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图按照以下建议实现矢量

#include "stdafx.h"
#include <iostream>
#include "resource.h"
#include <vector>

void testFunction(std::vector<int> addons);

int _tmain(int argc, _TCHAR* argv[])
{

    std::vector<int>  Addons ;
    for(int i = 0 ;i<10;++i)
    {
        Addons.push_back(i);
    }
     testFunction(Addons);
}

void testFunction(std::vector<int> addons)
{
    for(int i =0 ; …
Run Code Online (Sandbox Code Playgroud)

c++ visual-c++ c++11

8
推荐指数
2
解决办法
3万
查看次数

用c ++填充数组

我是c ++的新手.我试图编写以下代码,用新值填充数组的每个字节而不覆盖其他字符.下面的每个字节(r)应该在数组的新地址处加起来.

int _tmain(int argc, _TCHAR* argv[]) {
    char y[80];
    for(int b = 0; b < 10; ++b) {
        strcpy_s(y, "r");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果c ++中有任何可以执行此操作的功能,请告诉我.在上面的例子中,值'r'是任意的,这可以有任何新值.因此得到的字符数组应包含值rrrrr ... 10次.非常感谢您提前做好准备.

c++ visual-c++ c++11

7
推荐指数
1
解决办法
2万
查看次数

c ++中的strcpy_s

我是C++的新手.我正在编写以下简单代码.我想将字符[40]传递给一个函数,然后得到与输出相同的东西.如果我在下一点进行调试.strcpy_s(X,100,测试仪);

但如果我写"这是在输出端发送",它只需要"这个".任何人都可以请指出我缺少什么,并说明只接受几个字符的原因.

// BUSTesting.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include "resource.h"

int testFunction(char* tester);
int _tmain()
{

    char m[40];
    std::cin>>m;
    testFunction(m);
}
int testFunction(char* tester)
{

    char x[100] ;
    memset(x,100,sizeof(x));
    strcpy_s(x,100,tester);
    std::cout<<x;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ visual-c++

2
推荐指数
1
解决办法
7760
查看次数

标签 统计

c++ ×3

visual-c++ ×3

c++11 ×2

.net ×1

asp.net ×1

c# ×1

xml ×1

xml-parsing ×1