メンチカツには醤油でしょ!!

AWS/Java/Node.js/Spreadsheets/Docker/Jenkins/コミュニティ・勉強会レポを主とした技術系ブログ

https化した時のmixed-contentをPuppeteerでチェックする

https化した時の一般的な課題

https化した際の一般的な課題のひとつにmixed-contentというものがあります。
mixed-contentとは、ひとつのページ内にhttpのものとhttpsのものが混在した状態のことであり、これがあると一部の通信が暗号化されていないというセキュリティ的な懸念とブラウザ上に表示がされて閲覧者が不安になったりします。

下記はキャプチャの例です。
開発者コンソールにMixed Contentであることや、アドレスバーに警告が出たりします。

f:id:ryoichi0102:20181106192833p:plain

mixed-contentをなくすには?

簡単です。ページ内のhttpをhttpsにすべて書き換えます。

簡単ですが、、数が多いと結構な手間になります。。

そこでPuppeteerですよ

クローリングさせて、Mixed Contentを検知していきます。

ページオブジェクトに対して

page._client.on('Network.loadingFailed', (r) => {
  if (r.blockedReason === 'mixed-content') {
    //
  }
});

とすれば検知できます。

f:id:ryoichi0102:20181108080243p:plain

ソース全文はGitHubにあります

書き換えは手でやる必要がある?

好みですね。

ここまで自動化すると動いてるのを見てるだけ、もとい、見ていなくても書き換えが完了する所までは書けそうですが、やはり変更箇所というのは基本的に目で見ながらの方が良いかな…と思ったりもしています。

もしくは、変更した箇所の差分とかが出せるともっと良いですね!
ぜひ自身で書いてみて下さい。

書籍もありますよ

書籍ではmixed content自体には触れてはいませんが、そもそものスクリプトの書き方をはじめから丁寧に、そして、サイトの巡回の仕方がいろいろ実例を交えて書いてあります。

https://www.amazon.co.jp/dp/4798055204

ryoichi0102.hatenablog.com

参考 (Mixed Content)

developers.google.com

AWSプロモーションクレジットの有効期限と請求タイミングについて

期限ギリギリはどうなるか?

サポートに問い合わせてみました。

請求ダッシュボード⇒Creditsで確認できるクレジット一覧には
Expiration Date: 2018-10-31 (当月末)
のプロモーションクレジットがあるとします。
このクレジットは、2018-11(翌月)上旬に確定する2018-10(当月)分の請求に適用されるかどうか。

f:id:ryoichi0102:20181102204341p:plain

答え 

適用される。

請求とクレジットの適用は当月内に同時に行われるようです。
請求ダッシュボード⇒Billingで請求を確認してもクレジットが当月内にすでに適用されていることが確認できると思います。

まぁ、当然っちゃあ当然ですよね。

java.util.regex.Patternで取ったmatcherのgroupが取得できない

マッチしてるはずなのにIllegalStateException thrown: No match found

たとえば、ある文字列が「画面ID + 定型文字列」であるとして、ここから画面IDを抜き取るという実装を正規表現で行う場合…

jshellで実行してみると

まずは文字列の定義をします。この場合は"Bean"が定型文字列です。

jshell> String actionBeanName = "ScreenIdBean";
actionBeanName ==> "ScreenIdBean"

次に正規表現を定義します。任意の文字列で始まり1文字以上、そして後ろにBeanというパターンです。

jshell> Pattern p = Pattern.compile("^(.+)(Bean)$");
p ==> ^(.+)(Bean)$

matcherメソッドでMatchesオブジェクトを取得しgroup(1)を呼ぶと…なんとエラー!

jshell> p.matcher(actionBeanName).group(1)
|  java.lang.IllegalStateException thrown: No match found
|        at Matcher.group (Matcher.java:645)
|        at Matcher.group (Matcher.java:604)
|        at (#4:1)

確認のためにmatches()を呼ぶもtrue…

jshell> p.matcher(actionBeanName).matches()
$5 ==> true

再度group()を取っても同じくNo match foundエラーです。

一致しているはずなのに取れない理由は…

Matcherのmatches()を呼んだあと、そのオブジェクトでgroupを呼ぶ必要があります。
つまり下記のように、まずmを変数に代入して

jshell> java.util.regex.Matcher m = p.matcher(actionBeanName);
m ==> java.util.regex.Matcher[pattern=^(.+)(Bean)$ region=0,12 lastmatch=]

そのオブジェクトmのmatches()を呼んだ後に

jshell> m.matches()
$7 ==> true

groupを呼ぶと、目的の文字列が抽出できました。

jshell> m.group(1)
$8 ==> "ScreenId"

groupを呼ぶには、一旦matches()を呼ばないといけない

正規表現が必ず一致すると明確な場合、エラーチェックとなるmatches()を省略しがちですが、ここが落とし穴でした。

本来であれば下記のように安全な(?)コーディングを行うので、起こりえないです。

String actionBeanName = "ScreenIdBean";
Matcher m = PATTERN.matcher(actionBeanName);
if (m.matches()) {
String screenId = m.group(1);
// 何かしらの処理.
} else {
// マッチしなかった場合の処理.
}

と、必ずエラーチェックしてたから今まで知らなかったと言い訳しておきます^^;

参考

stackoverflow.com