ホーム » SVG
「SVG」カテゴリーアーカイブ
SVG 脆弱性
wordpress で svg を追加しようとすると,
Arial__A.svg
このファイルタイプはセキュリティの観点から許可されていません。
「SVG 脆弱性」で検索するといっぱい出てくる.
Blaze’s Security Blog Nemucod downloader spreading via Facebook
The Hacker News Spammers using Facebook Messenger to Spread Locky Ransomware
普通にファイルをアップロードできる場所を用意して,それを参照する方法で対応.
XML の読込テスト – 4
全ては表現できてないが,msxml.dll により読込んだデータの関連はこんな感じか?
IXMLDOMDocument | ||||||
documentElement | ——– | IXMLDOMElement | ||||
attributes | ——– | IXMLDOMNamedNodeMap | ||||
length | ||||||
item 0 | ——– | IXMLDOMAttribute | ||||
: | ||||||
item n-1 | name | |||||
value | ||||||
childNodes | ——– | IXMLDOMNodeList | ||||
length | ||||||
item 0 | ——– | IXMLDOMElement | ||||
: | ||||||
: | ||||||
item n-1 | ——– | IXMLDOMNode | ||||
text | ||||||
nodeName | ||||||
tagName | ||||||
XML の読込テスト – 3
BOOL ReadElement( MSXML::IXMLDOMElementPtr pElement, long indent ) { CString tab = _T("\t\t\t\t\t\t\t\t\t\t\t\t\t") ; CString lsp = tab.Left(indent) ; if (pElement == NULL) { return FALSE ; } MSXML::IXMLDOMNodeListPtr pNode = pElement->GetchildNodes() ; { CString node = LPCTSTR(pElement->GetnodeName()) ; CString tagN = LPCTSTR(pElement->GettagName()) ; CString text ; // if (pNode->Getlength() == 0) { text = LPCTSTR(pElement->Gettext()) ; // } MSXML::IXMLDOMNamedNodeMapPtr aMap = pElement->Getattributes() ; CString str ; if (aMap != NULL) { str = ::ToString(aMap->Getlength()) ; for (int aIndex=0 ; aIndex<aMap->Getlength() ; aIndex++) { MSXML::IXMLDOMAttributePtr attr = aMap->Getitem(aIndex) ; if (attr == NULL) { continue ; } str += CString(_T("\t")) + LPCTSTR(attr->Getname()) ; str += CString(_T(" ")) + ::ToStringTC(LPCWSTR(attr->Getvalue().bstrVal)) ; } } cout << LPCTSTR(lsp) << LPCTSTR(node) << _T("\t") << LPCTSTR(text) << _T("\t") << LPCTSTR(str) << endl ; for (int index=0 ; index<pNode->Getlength() ; index++) { MSXML::IXMLDOMElementPtr child = pNode->Getitem(index) ; ReadElement(child,indent+1) ; } } return TRUE ; }
attr->value が,VARIANT で,VT_BSTR
これを LPCTSTR とすることは出来ず,::ToStringTC をしている.
::ToStringTC は引数とコンパイルオプションにより char* ⇔ wchar* が可能
今回の場合,内部では ::WideCharToMultiByte で変換している.
要素の内容の取得はこんな感じか?
// text = LPCTSTR(pElement->Gettext()) ; if (pNode->Getlength() > 0) { MSXML::IXMLDOMNodePtr pText = pNode->Getitem(0) ; if (pText != NULL) { text = LPCTSTR(pText->text) ; } }
XML の読込テスト – 2
要素へのアクセスはこんな感じと思われるが,Gettext の使い方がよくわからない.
BOOL ReadElement(MSXML::IXMLDOMElementPtr pElement,long indent)
{
CString tab = _T(“\t\t\t\t\t\t\t\t\t\t\t\t\t”) ;
CString lsp = tab.Left(indent) ;
if (pElement == NULL) { return FALSE ; }
MSXML::IXMLDOMNodeListPtr pNode = pElement->GetchildNodes() ;
{
CString node = LPCTSTR(pElement->GetnodeName()) ;
CString tagN = LPCTSTR(pElement->GettagName()) ;
CString text ;
// if (pNode->Getlength() == 0) {
text = LPCTSTR(pElement->Gettext()) ;
// }
cout << LPCTSTR(lsp) << LPCTSTR(node) << _T(“\t”) << LPCTSTR(text) << endl ;
for (int index=0 ; index<pNode->Getlength() ; index++) {
MSXML::IXMLDOMElementPtr child = pNode->Getitem(index) ;
ReadElement(child,indent+1) ;
}
}
return TRUE ;
}
BOOL TestXML (void)
{
…
if (pDoc->load(LPCTSTR(loadFile)) == VARIANT_TRUE) {
{
MSXML::IXMLDOMElementPtr root = pDoc->documentElement ;
ReadElement(root,0) ;
}
}
…
}
XML の読込テスト
// L_xml_2.cpp : コンソール アプリケーション用のエントリ ポイントの定義
//
#include “StdAfx.h”
#include “L_xml_2.h”
#import <msxml.dll> named_guids
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BOOL TestXML (void)
{
HRESULT hr = ::CoInitialize(NULL) ;
if (FAILED(hr)) { return FALSE ; }
{
MSXML::IXMLDOMDocumentPtr pDoc = NULL ;
hr = pDoc.CreateInstance(MSXML::CLSID_DOMDocument) ;
if (FAILED(hr)) { return FALSE ; }
CString loadFile = _T(“test.xml”) ;
{
if (pDoc->load(LPCTSTR(loadFile)) == VARIANT_TRUE) {
printf(“%s\r\n”,(LPCSTR)pDoc->xml) ;
{
MSXML::IXMLDOMElementPtr root = pDoc->documentElement ;
CString tagN = LPCTSTR(root->tagName) ;
CString text = LPCTSTR(root->text) ;
printf(“<%s>%s\r\n”,tagN,text) ;
MSXML::IXMLDOMNodeListPtr nodeL = root->childNodes ;
for (int index=0 ; index<nodeL->Getlength() ; index++) {
MSXML::IXMLDOMElementPtr child = nodeL->Getitem(index) ;
CString tagN = LPCTSTR(child->tagName) ;
CString text = LPCTSTR(child->text) ;
printf(“<%s>%s\r\n”,tagN,text) ;
}
}
}
else {
printf(_T(“error … %s\r\n%s\r\n”),loadFile,(LPCSTR)pDoc->parseError->Getreason()) ;
}
}
}
::CoUninitialize() ;
return TRUE ;
}
/////////////////////////////////////////////////////////////////////////////
// 唯一のアプリケーション オブジェクト
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// MFC の初期化および初期化失敗時のエラーの出力
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 必要に応じてエラー コードを変更してください。
cerr << _T(“Fatal Error: MFC initialization failed”) << endl;
nRetCode = 1;
}
else
{
/*
// TODO: この位置にアプリケーションの動作を記述してください。
CString strHello;
strHello.LoadString(IDS_HELLO);
cout << (LPCTSTR)strHello << endl;
*/
TestXML() ;
}
return nRetCode;
}
文字列の縦方向の配置
svg:text の配置で,横方向の指定(text-anchor=”middle”)はあるが,縦方向はなさそうだったので…
if (fabs(incX) > 1e-7 || fabs(incY) > 1e-7) {
CString moveStr = _T(“translate(“)+ToString(pnt.x)+_T(“,”)+ToString(pnt.y)+_T(“)\t”) ;
CString rot_Str ;
CString skewStr ;
if (fabs(incX) > 1e-7) {
rot_Str = _T(“rotate(“)+ToString(0-incX)+_T(“,0,0)\t”) ;
}
if (fabs(incY) > 1e-7) {
skewStr = _T(“skewX(“) + ToString(0+incY) + _T(“)\t”) ;
}
CString vAlign ;
{
P2 move = P2(0,0+txH.GetHeight()/3) ;
vAlign = _T(“translate(“) + ToString(move.x) + _T(“,“) + ToString(move.y) + _T(“)\t”) ;
}
th.AddAttribute (_T(“transform”), moveStr + rot_Str + skewStr + vAlign ) ;
}
else {
th.AddAttribute (_T(“x”), ::ToString(pnt.x)) ;
th.AddAttribute (_T(“y”), ::ToString(pnt.y+txH.GetHeight()/3)) ;
}
文字列と文字の回転
{
TextH txH = parts1.GetTextH (thIndex) ;
P3 pnt = parts1.GetPTextH(thIndex) ;
XmlOut_E th(_T(“text”),txH.GetText()) ;
{
th.AddAttribute (_T(“text-anchor”), _T(“middle”) ) ;
th.AddAttribute (_T(“font-size”), ::ToString(txH.GetHeight())) ;
}
if (fabs(txH.GetIncX()) > 1e-7 || fabs(txH.GetIncY()) > 1e-7) {
CString moveStr = _T(“translate(“) + ToString(pnt.x) + _T(“,”) + ToString(pnt.y) + _T(“)\t”) ;
CString rot_Str ;
CString skewStr ;
if (fabs(txH.GetIncX()) > 1e-7) {
rot_Str = _T(“rotate(“) + ToString(0-txH.GetIncX()) + _T(“,0,0)\t”) ;
}
if (fabs(txH.GetIncY()) > 1e-7) {
skewStr = _T(“skewX(“) + ToString(0+txH.GetIncY()) + _T(“)\t”) ;
}
th.AddAttribute (_T(“transform”), moveStr + rot_Str + skewStr ) ;
}
else {
th.AddAttribute (_T(“x”), ::ToString(pnt.x)) ;
th.AddAttribute (_T(“y”), ::ToString(pnt.y)) ;
}
g.AddChild(th) ;
}
translate で回転の位置に動かし,
rotate で文字列を回転
skewX で文字を傾ける
XML の書出しテスト – 5
MSXML.dll を利用しない方法を用意.
//#include “Xml_MS_.hxx”
#include “XmlOut.hxx”
#include “SvgOut.hxx”
class Xml_Attribute {
public:
// …
protected:
CString Name ;
CString Value ;
} ;
class XmlOut_E {
public:
// …
protected:
CString Name ;
CString Text ;
CArray<Xml_Attribute,Xml_Attribute> Attribute ;
protected:
CArray<XmlOut_E,XmlOut_E> Child ;
} ;
inline
BOOL XmlOut::Export (const XmlOut_E& elements,LPCTSTR svgName)
{
#ifdef UseMSXML
return Xml_MS::Export(elements,svgName) ;
#endif
CStringArray strAry ;
{
#ifdef _UNICODE
CString xml_ver = _T(“<?xml version=\”1.0\” encoding=\”utf-16\”?>”) ;
#else
CString xml_ver = _T(“<?xml version=\”1.0\” encoding=\”Shift-JIS\”?>”) ;
#endif
strAry.Add( xml_ver) ;
}
{
CStringArray sa ;
CreateElement(elements,&sa,0) ;
strAry.Append(sa) ;
}
return ::SaveText(svgName,strAry,TRUE) ;
}
inline
BOOL XmlOut::CreateElement (const XmlOut_E& elements,CStringArray* sa,const int indent)
{
CString tab = _T(“\t\t\t\t\t\t\t\t\t\t\t\t\t”) ;
CStringArray strAry ;
int nowIndent = indent ;
if (elements.IsComment()) {
sa->Add(tab.Left(indent) + _T(“<!–“)+elements.GetText()+_T(“–>”)) ;
return TRUE ;
}
CString eleStr ;
{
eleStr = tab.Left(indent) + _T(“<“) + elements.GetName() + _T(” “) ;
CString attStr ;
for (int aIndex=0 ; aIndex<elements.GetAttributeCount() ; aIndex++) {
Xml_Attribute a = elements.GetAttribute(aIndex) ;
CString name = a.GetName () ;
CString value= a.GetValue() ;
attStr += name + _T(“=\””) + value + _T(“\”\t”) ;
}
if (!attStr.IsEmpty()) {
eleStr += attStr ;
}
CString nameOrChild ;
if (!elements.GetText().IsEmpty()) {
nameOrChild = elements.GetText() ;
eleStr += _T(” >”) + nameOrChild ;
}
else {
CStringArray saChild ;
for (int cIndex=0 ; cIndex<elements.GetChildCount() ; cIndex++) {
XmlOut_E c = elements.GetChild(cIndex) ;
CreateElement(c,&saChild,indent+1) ;
}
if (saChild.GetSize() > 0) {
::StringArrayToString(saChild,nameOrChild) ;
eleStr += _T(” >\r\n”) + nameOrChild ;
}
}
if (nameOrChild.IsEmpty()) {
eleStr += _T(“/>”) ;
}
else {
if (!elements.GetText().IsEmpty()) {
eleStr += _T(“</”) + elements.GetName() + _T(“>”) ;
}
else {
eleStr += tab.Left(indent+1) + _T(“</”) + elements.GetName() + _T(“>”) ;
}
}
strAry.Add(eleStr) ;
}
return sa->Append(strAry) ;
}
xmlns を間違えて 0xE06D7363
xmlns の所を xmlne とタイプミス.そのまま実行して 0xE06D7363.
—————————
Microsoft Visual C++
—————————
ハンドルされていない例外 は T_xml_7.exe (KERNEL32.DLL) にあります: 0xE06D7363: Microsoft C++ Exception。
—————————
OK
—————————
通常の実行の場合は,
—————————
Microsoft Visual C++ Debug Library
—————————
Debug Error!
Program: …NGS\ALL USERS\DOCUMENTS\VC_TEST\SVG\T_xml_7\Debug\T_xml_7.exe
abnormal program termination
(Press Retry to debug the application)
—————————
中止(A) 再試行(R) 無視(I)
—————————
XML の書出しテスト – 4
xmlns="" が付加されない方法がわからなかったので,逆に svg:svg などと出力する様に変更.
<?xml version="1.0" encoding="utf-8"?>
<!–SVG 出力テスト–>
<svg:svg width="50%" height="50%" viewBox="0 0 100 100" xmlns:svg="http://www.w3.org/2000/svg">
<svg:g stroke="red" stroke-width="0.3" stroke-dasharray="3 3">
<svg:line x1="0" x2="0" y1="10" y2="90"/>
<svg:line x1="10" x2="10" y1="10" y2="90"/>
<svg:line x1="20" x2="20" y1="10" y2="90"/>
<svg:line x1="30" x2="30" y1="10" y2="90"/>
<svg:line x1="40" x2="40" y1="10" y2="90"/>
</svg:g>
</svg:svg>
BOOL TestXML (void)
{
HRESULT hr = ::CoInitialize(NULL) ;
if (FAILED(hr)) { return FALSE ; }
{
MSXML::IXMLDOMDocumentPtr pDoc = NULL ;
hr = pDoc.CreateInstance(MSXML::CLSID_DOMDocument) ;
if (FAILED(hr)) { return FALSE ; }
MSXML::IXMLDOMProcessingInstructionPtr pi = pDoc->createProcessingInstruction(L”xml”, L”version=’1.0′ encoding=’utf-8′ “);
pDoc->appendChild(pi);
MSXML::IXMLDOMCommentPtr pc = pDoc->createComment(L”SVG 出力テスト”);
pDoc->appendChild(pc);
{
MSXML::IXMLDOMElementPtr pRoot = NULL ;
pRoot = pDoc->createElement(L”svg:svg”);
{ // <svg width =’50%’ height=’50%’ viewBox=’0 0 100 100′ xmlns=”http://www.w3.org/2000/svg”>
MSXML::IXMLDOMAttributePtr paw = pDoc->createAttribute(L”width”);
paw->value = L”50%”;
pRoot->setAttributeNode(paw);
MSXML::IXMLDOMAttributePtr pah = pDoc->createAttribute(L”height”);
pah->value = L”50%”;
pRoot->setAttributeNode(pah);
MSXML::IXMLDOMAttributePtr pav = pDoc->createAttribute(L”viewBox”);
pav->value = L”0 0 100 100″;
pRoot->setAttributeNode(pav);
MSXML::IXMLDOMAttributePtr pan = pDoc->createAttribute(L”xmlns:svg”);
pan->value = _T(“http://www.w3.org/2000/svg”) ;
pRoot->setAttributeNode(pan);
}
pDoc->appendChild(pRoot);
{ // <g stroke=’red’ stroke-width=’0.3′ stroke-dasharray=’3 3′>
MSXML::IXMLDOMElementPtr pGrop= pDoc->createElement(_T(“svg:g”));
{
MSXML::IXMLDOMAttributePtr pas = pDoc->createAttribute(L”stroke”);
pas->value = _T(“red”) ;
pGrop->setAttributeNode(pas);
MSXML::IXMLDOMAttributePtr paw = pDoc->createAttribute(L”stroke-width”);
paw->value = _T(“0.3″) ;
pGrop->setAttributeNode(paw);
MSXML::IXMLDOMAttributePtr pad = pDoc->createAttribute(L”stroke-dasharray”);
pad->value = _T(“3 3″) ;
pGrop->setAttributeNode(pad);
}
pRoot->appendChild(pGrop) ;
{
for (int index=0 ; index<5 ; index++) {
// <line x1=”10″*x x2=”10″*x y1=”0″ y2=”100″ />
MSXML::IXMLDOMElementPtr pLine= pDoc->createElement(L”svg:line”);
{
CString xStr ; xStr.Format(_T(“%d”),10*index) ;
MSXML::IXMLDOMAttributePtr pax = pDoc->createAttribute(L”x1″);
pax->value = LPCTSTR(xStr) ;
pLine->setAttributeNode(pax);
MSXML::IXMLDOMAttributePtr pa2 = pDoc->createAttribute(L”x2″);
pa2->value = LPCTSTR(xStr) ;
pLine->setAttributeNode(pa2);
MSXML::IXMLDOMAttributePtr pay = pDoc->createAttribute(L”y1″);
pay->value = _T(“10″) ;
pLine->setAttributeNode(pay);
MSXML::IXMLDOMAttributePtr pae = pDoc->createAttribute(L”y2”);
pae->value = _T(“90”) ;
pLine->setAttributeNode(pae);
}
pGrop->appendChild(pLine) ;
}
}
}
}
CString tmpPath ;
{
UINT size = MAX_PATH ;
::GetTempPath (size,tmpPath.GetBuffer(size)) ;
tmpPath.ReleaseBuffer() ;
}
CString tmpSVG = tmpPath + CTime::GetCurrentTime().Format(_T(“%H%M%S.svg”)) ;
pDoc->save(LPCTSTR(tmpSVG)) ;
}
::CoUninitialize() ;
return TRUE ;
}
XML の書出しテスト – 3
msxml.dll を利用して,点線の line を 5 本出力.
空の xmlns 属性が出来てしまうため,そのままでは表示されない.
<?xml version="1.0" encoding="utf-8" ?> <!--SVG 出力テスト--> <svg width="50%" height="50%" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"> <g xmlns="" stroke="red" stroke-width="0.3" stroke-dasharray="3 3"> <line x1="0" x2="0" y1="10" y2="90" /> <line x1="10" x2="10" y1="10" y2="90" /> <line x1="20" x2="20" y1="10" y2="90" /> <line x1="30" x2="30" y1="10" y2="90" /> <line x1="40" x2="40" y1="10" y2="90" /> </g> </svg>
XML の書出しテスト – 2
loadXML の部分を改良.
// pDoc->loadXML(_T(""< ?xml version=\"1.0\" encoding=\"utf-8\"?>"< r>"< /r>")) ; // Source: dynamDOMsmart.cpp より MSXML::IXMLDOMProcessingInstructionPtr pi = pDoc->createProcessingInstruction(L"xml", L"version='1.0' encoding='utf-8' "); pDoc->appendChild(pi); // Create a comment for the document. MSXML::IXMLDOMCommentPtr pc = pDoc->createComment(L"sample xml file created using XML DOM object."); pDoc->appendChild(pc);
XML の書出しテスト
XML に書き出すコードをテスト (VC6 + MFC で動作するもの)
他の言語や VC 9 などの場合は How Do I Use DOM? にある.
pDoc.CreateInstance で,結果が
0x800401f0 CoInitialize は呼び出されていません。
xml のファイルは出来るが,中身がなし.
pDoc->loadXML(…) で,デバッグの出力に以下が 3 つ.
例外処理 (初回) は T_xml_1.exe (KERNEL32.DLL) にあります: 0xE0000001: (名前がありません)。
ここで手間取ったので,…
loadXML で与える文字列が,XML の文字列として正しくなかったのが原因.
// 以下は,そのテストコード全体 // T_xml_1.cpp : コンソール アプリケーション用のエントリ ポイントの定義 // #include "StdAfx.h" #include "T_xml_1.h" #import named_guids #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif BOOL TestXML (void) { HRESULT hr = ::CoInitialize(NULL) ; if (FAILED(hr)) { return FALSE ; } { MSXML::IXMLDOMDocumentPtr pDoc = NULL ; hr = pDoc.CreateInstance(MSXML::CLSID_DOMDocument) ; if (FAILED(hr)) { return FALSE ; } pDoc->loadXML(_T("<?xml version=\"1.0\" encoding=\"utf-8\"?> <r> </r> ")) ; CString tmpPath ; { UINT size = MAX_PATH ; ::GetTempPath (size,tmpPath.GetBuffer(size)) ; tmpPath.ReleaseBuffer() ; } CString tmpXML = tmpPath + CTime::GetCurrentTime().Format(_T("%H%M%S.xml")) ; pDoc->save(LPCTSTR(tmpXML)) ; } ::CoUninitialize() ; return TRUE ; } ///////////////////////////////////////////////////////////////////////////// // 唯一のアプリケーション オブジェクト CWinApp theApp; using namespace std; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // MFC の初期化および初期化失敗時のエラーの出力 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: 必要に応じてエラー コードを変更してください。 cerr << _T("Fatal Error: MFC initialization failed") << endl; nRetCode = 1; } else { /* // TODO: この位置にアプリケーションの動作を記述してください。 CString strHello; strHello.LoadString(IDS_HELLO); cout << (LPCTSTR)strHello << endl; */ TestXML() ; } return nRetCode; }