Iwao Dev

気付いたことをメモしています.

この画面は、簡易表示です

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
普通にファイルをアップロードできる場所を用意して,それを参照する方法で対応.


  にほんブログ村 IT技術ブログへ


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         
             
             

  にほんブログ村 IT技術ブログへ


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) ;
}
}


  にほんブログ村 IT技術ブログへ


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) ;
}
}

}


msxml.tlh をプロジェクトに追加すると,クラスビューで表示できる.


  にほんブログ村 IT技術ブログへ


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;
}


  にほんブログ村 IT技術ブログへ


文字列の縦方向の配置

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)) ;
    }


  にほんブログ村 IT技術ブログへ


文字列と文字の回転

{
  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 で文字を傾ける


  にほんブログ村 IT技術ブログへ


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) ;
}


  にほんブログ村 IT技術ブログへ



    top

    %d人のブロガーが「いいね」をつけました。