UWSCスクリプトのセキュリティ対策

UWSCスクリプトに色々情報が書かれているので、
セキュリティに懸念があります。
誰でもパスワードが読み取れたり、
実行できたりするので、何か対策はありますか。
また、指定のフォルダからのみ実行できるようにすることは可能ですか。
UWSCスクリプトは便利ですが、
スクリプト自体を持ち出されたり、読み取られたり、
他の人でも実行できてしまうケースがあります。
いくつか対策を考えてみましたので下に記して見ます。
※パスワード、ファイルの持ち出し、その他の各セキュリティポリシーはご自身で検討お願いします
※UWSCのスクランブルについても絶対に解読されない事を保障するものでもありません

スクランブルをかけて、解読を困難にする

まずはスクランブルを実施することで、
中身の解読を困難にしてしまう方法があります。
パスワードを埋め込んでいたりする場合は、
ファイルの中から該当情報を取得することが難しくなります。
スクランブルのかけ方については、
コチラの記事の「スクランブル」をご参照ください。

実行時にパスワードを要求する

INPUT関数IF文を組み合わせて、
実行時にパスワードを要求するようにすることができます。
この方法とスクランブルの組み合わせで、
セキュリティを向上させることができます

IFB INPUT("パスワードを入力してください","",TRUE) <> "1234" THEN
  MSGBOX("パスワードが異なるため処理を終了します")
  EXITEXIT
ENDIF

PRINT "処理を実行しました!"

上のスクリプトは、
パスワードに「1234」を入力しないと、
次の処理が実行されずに終了してしまいます。
このスクリプトにスクランブルをかけることで、
実行時パスワードの取得も困難になります。

指定のディレクトリからのみ実行可とする

DOSCMD関数で、
スクリプトの実行位置ディレクトリを知ることができます。 これが指定のディレクトリと異なる場合は実行しないよう制御することができます。

CURDIR = TRIM(DOSCMD("CD"))

IFB CURDIR <> "C:\uwsc" THEN
  MSGBOX("指定位置と異なります")
  EXITEXIT
ENDIF

 PRINT "処理を実行しました!"

*

上記のスクリプトでは、Cドライブ直下にuwscというフォルダを作成し、
そこにあるスクリプトのみ実行できる仕組みになっています。
別のマシンでも同一のフォルダ構成を作成された場合は、
実行可能となる点は注意です。

別のファイルを読み込むようにする

CALLで、
他のスクリプトを呼び出す文を挿入しておけば、
単体での実行は出来なくなります。

 CALL "../required.uws"
 PRINT "処理を実行しました"

*

フォルダ構成は上記のようになっており、
一つ上の階層にrequired.uwsをおく必要があります。
required.uws自体は中身は空でも問題ありません。

外部Webサイトの情報を利用する

指定のページにアクセスし、
ページ内の情報が一致する場合に
次の処理に進むようにしてみます。
Webページの情報を書き換えて
スクリプトの実行可否を制御することができます。

IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.visible = FALSE //バックグラウンドでチェックするため、画面表示しなくてもよい
IE.navigate("http://canal22.org/")
REPEAT
 SLEEP(0.1)
UNTIL !IE.busy AND IE.readyState = 4
TITLE = IE.document.title
IE.QUIT
IFB TITLE <> "UWSC コバヤシ式" THEN
  MSGBOX("認証できません。処理を終了します")
  EXITEXIT
ENDIF

上のスクリプトはcanal22.orgへアクセスし、
そのページのタイトルを照合しています。
バックグラウンドでチェックが進めば良いので、
visibleのプロパティはFALSEにしています。

上記全ての方法を組み合わせてみる

さて、何種類か方法を挙げてみましたので、
全てを組み合わせたスクリプトを作ってみます。
処理の順番は・・・
現在位置(ディレクトリ)の確認

外部スクリプトの確認

パスワード入力

外部サイトの確認
となります。
最後に任意でスクランブルをかけ、
解読を困難にすることも可能です。
スクリプトは下記のとおりです。

この投稿の続きを読む »

タグ

2013年3月16日 | コメントは受け付けていません。 |

カテゴリー:Q&A

COMオブジェクト操作関連

COMオブジェクト操作関連関数

COMについては上級者編で解説されております。
関数を使用した具体的なCOMオブジェクトの活用例は上級者編をご参照下さい。

CREATEOLEOBJ

COMオブジェクト生成
戻値 = CREATEOLEOBJ( COMオブジェクト名 )
引数
 COMオブジェクトを指定
戻値
 COMオブジェクト
なお、COMからメソッド使用時に引数に値取得がある場合
引数の変数の前にVarを付記


GETACTIVEOLEOBJ

既に起動中のCOMオブジェクトを取得
戻値 = GETACTIVEOLEOBJ(COMオブジェクト名,[タイトル, 順番])
引数
 COMオブジェクトを指定
 タイトル: 複数時にタイトルで区別(部分一致可)
 なお、Excel、Access、Wordの場合はファイル名を指定
 IE、Office以外では無効
 順番: IEのみ有効、タイトルが同じ時に区別
戻値
 COMオブジェクト


GETOLEITEM

コレクションの取得
戻値 = GETOLEITEM( コレクションプロパティ名)
引数
 コレクションプロパティ名:COMオブジェクトのコレクション取得プロパティ名を指定
戻値
 取得したコレクションの数
 取得したコレクションは配列変数の
 ALL_OLE_ITEM[ ]に配列ゼロから格納


OLEEVENT

イベント処理の定義
OLEEVENT( COMオブジェクト, インタフェース名, イベント名, Procedure名)
引数
 COMオブジェクトを指定
 インタフェース名: ディスパッチインタフェース名
 イベント名
 Procedure名:UWSC側Procedure
 Procedure内にてイベントの引数は配列変数EVENT_PRM[ ]に配列ゼロから格納


COM_ERR_IGN-COM_ERR_RET

COMエラーメッセージの抑止
COM_ERR_IGN
 ・・・COM処理・・・
COM_ERR_RET
COM処理中のエラーはCOM_ERR_FLG にTRUEが設定


SAFEARRAY

SAFEARRAY型の作成
戻値 = SAFEARRAY( [下限, 上限])
引数
 下限: 配列の下限を設定
 上限: 配列の上限を設定
戻値
 作成されたSAFEARRAY型を返す


タグ

2012年8月16日 | コメントは受け付けていません。 |

カテゴリー:関数一覧

script0006


script0006
UWSCコバヤシ式にアクセスする基本構文
参考:http://canal22.org/gyaku/createoleobj/

ダウンロードする

タグ

2012年6月4日 | コメントは受け付けていません。 |

カテゴリー:ツール

COMコンポーネントの開いているウィンドウを制御する(GETACTIVEOLEOBJ)

開いているウィンドウを制御する
GETACTIVEOLEOBJ(“InternetExplorer”,ウィンドウタイトル)

GETACTIVEOLEOBJ関数は、
既に開いているウィンドウを制御する場合に使います。
「ウィンドウタイトル」は制御したい対象のウィンドウタイトルを記述しますが、
一部でも構いません。 ※一部アプリでは無効

アクティブにしたウィンドウのタイトルタグを取得するサンプル

IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://www.google.co.jp/")
BusyWait(IE)

IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://www.yahoo.co.jp/")
BusyWait(IE)

FOR KAISU = 1 TO 5
	IE = GETACTIVEOLEOBJ("InternetExplorer.Application","Google")
	SLEEP(1)
	PRINT IEGetSrc(IE, "TITLE")
	IE = GETACTIVEOLEOBJ("InternetExplorer.Application","yahoo")
	SLEEP(1)
	PRINT IEGetSrc(IE, "TITLE")
NEXT


Procedure BusyWait(ie)
  Sleep(0.5)  // Wait
  Const TIME_OUT = 90
  tm = Gettime()
  repeat
    Sleep(0.2)
    ifb Gettime() - tm > TIME_OUT
      MsgBox("Time Out:BusyWait")
      ExitExit
    endif
  until (! ie.busy) and (ie.readyState=4)
  Sleep(0.5)
Fend

解説

このプログラムを動かすと、
GETACTIVEOLEOBJが働いていることが確認できます。

タグ

2012年5月19日 | コメントは受け付けていません。 |

カテゴリー:逆引き関数

IEの基本スクリプト(CreateOLEObj)

UWSCコバヤシ式にアクセスする基本構文

IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://canal22.org/")
BusyWait(IE)
SLEEP(45)
IE.Quit // IE終了

//------
Procedure BusyWait(ie)
  Sleep(0.5)  // Wait
  Const TIME_OUT = 90
  tm = Gettime()
  repeat
    Sleep(0.2)
    ifb Gettime() - tm > TIME_OUT
      MsgBox("Time Out:BusyWait")
      ExitExit
    endif
  until (! ie.busy) and (ie.readyState=4)
  Sleep(0.5)
Fend
IE.Navigate("about:blank") // INPUT
BusyWait(IE)

解説

初にCreateOLEObjでCOMオブジェクトを作成します。
COMオブジェクト(COMコンポーネント)
Microsoftが提唱するオブジェクトの規格です。

プログラマーになるわけではなければ、
この辺はつっこまなくても良いかと思います。
呪文のように上記スクリプトを覚えれば、UWSCでIEの操作はできます。

ちなみに多くの例文が、IEという変数を使っているので、
インタネットエクスプローラーを扱うなら,
IEとしなければならないような錯覚に陥りますが、
実際は、IEYOUFとしても同様に動作します。

YOUFにしたサンプル

YOUF = CreateOLEObj("InternetExplorer.Application")
YOUF.Visible = True
YOUF.Navigate("http://canal22.org/")
BusyWait(YOUF)
SLEEP(45)
YOUF.Quit // YOUF終了

//------
Procedure BusyWait(YOUF)
  Sleep(0.5)  // Wait
  Const TIME_OUT = 90
  tm = Gettime()
  repeat
    Sleep(0.2)
    ifb Gettime() - tm > TIME_OUT
      MsgBox("Time Out:BusyWait")
      ExitExit
    endif
  until (! YOUF.busy) and (YOUF.readyState=4)
  Sleep(0.5)
Fend
YOUF.Navigate("about:blank") // INPUT
BusyWait(YOUF)

とはいえ、多くの方がIEとしているので、
IEにしておくのが無難です。
で、あとは、
オブジェクトに対してNavigateなどメソッドやプロパティを適用しています。
visibleは可視化でNavigateは移動です。
また、UWSC 上級者ページではCOMに関するさらに詳細な説明があります。

COMコンポーネントの解説は以下のページがわかりやすいです。
http://emeditor.web.fc2.com/EmEditor_Macro_COM_Component.html

タグ

2012年4月12日 | コメントは受け付けていません。 |

カテゴリー:逆引き関数

COMオブジェクトからInternet Explorerを操作したい

COMオブジェクトからInternet Explorerを操作したい
Intetnet Explorer(以下、IE)を起動する方法はいくつかありますが、
その中でも一番早く、確実なのがCOMオブジェクトを操作することです。

しかし、COMオブジェクトは使い方が少し難しいので
初めての方には
とっつきにくい所でもあります。

まずは習うより慣れよ。
簡単な手順を通して
見ていきましょう。

今回はIEを立ち上げて、あるWebサイトにアクセス、
その後、ページ内にあるHTMLテキストを
全部取ってきて、メモ帳に貼り付ける。
というスクリプトを作ってみます。

まずは、IEを立ち上げるところを
コーディングします。

IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.visible = True

これで、IEが立ち上がり
何もないページがウィンドウに表示されるはずです。
この中が何をやっているか、
最初のうちは分からないでもOKです。
IEを操作するオブジェクトを変数”IE”に入れ、
その”IE”に対して、まずは画面上に現れなさい(visible = True)と
命令していると思えば大丈夫です。

次にあるページ(今回はGoogle)に
アクセスさせましょう。

IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.visible = True
IE.navigate("http://www.google.co.jp/")
REPEAT
 SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4

REPEAT-UNTILによる繰り返し制御が行われております。
何を繰り返しているかと言うと
SLEEP(0.1)
つまりある条件になるまでは
ずっと「0.1秒待つ」という行為を繰り返すのです。

ある条件とは
!IE.busy AND IE.readystate = 4
です。
あるWebページにアクセスすると
必ずアクセスして情報取得するまでに数秒程の待ち時間が発生します。
この時間を考慮しないで、次の処理をどんどん書いてしまうと、
必要な情報が読み込まれていないので
エラーになってしまいます。

IE.busyでIEが他の処理を実行しているか、していないか、状態を返してくれます。

いわゆる、ビジー状態かそうでないかを判別してくれるのです。
IE.busyはビジー状態ならばTrue、そうでないならばFalseを返します。
ビジー状態でなければ次の処理に行っても問題ないので、頭に「!」をつけて
「ビジー状態でなければ」という条件を表現します。
頭につく「!」は「否定」を表します。
ビジー状態でない⇒Falseが返ってくる⇒頭に「!」⇒FalseがTrueに変換される
結果、REPEAT-UNTILの条件判定箇所でTrueが返って来るのです。

同様に
IE.readystate = 4
という条件も見ています。
readystateとは「今、どういう状態か」を数字で返してくれます。
4は完了を意味します。
0~3も意味がありますが参考程度ですので、下に記します。
readystate = 0 (未開始)
readystate = 1 (読み込み開始)
readystate = 2 (読み込み中)
readystate = 3 (読み込み中で操作も可能)

読み込みが完了すれば、アクセスしたページのデータは
操作できますので、そのままメモ帳に貼り付けましょう。

IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.visible = True
IE.navigate("http://www.google.co.jp/");
REPEAT
 SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
SENDSTR(EXEC("notepad"),IE.document.body.innerTEXT)

最後にメモ帳を起動し、
IE.document.body.innerTEXT
で、Webページ中の全テキストを取得して、送信しています。

それでは少し応用して、
ある3サイトにアクセスして、
各ページのテキストをそれぞれメモ帳に
貼り付けるスクリプトを作ってみましょう。

スクリプトはこのようになります。

この投稿の続きを読む »

タグ

2012年3月10日 | コメントは受け付けていません。 |

カテゴリー:Q&A

このページの先頭へ