まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

タグ:wget

2024 年になってから yum(dnf) 関連のブログエントリばかり書いてる気がしますが、今回のテーマも yum(dnf) 関連です。

前回のブログでも書いたのですが、yum は指定したモジュールを「ダウンロードだけ実行する(インストールは行わない)」ことを指定するパラメータがあります:
"yum install xxxxx" でインストールされるモジュールをダウンロードだけする

yum はダウンロードした .rpm ファイルを一時フォルダに格納して、その .rpm ファイルを使ってローカルインストールを実行します。インストールは普通に rpm ツールを使って実行するだけなのですが、今回のブログテーマはその手前、「ダウンロード」する部分に着目します。

例えば以下のような場面に遭遇しているとします(あまり関係ないですが RHEL 8.8 で実行した内容です):
# yum install ansible
Updating Subscription Management repositories.
Last metadata expiration check: 2:22:50 ago on Tue 02 Jan 2024 05:03:04 AM UTC.
Dependencies resolved.
================================================================================
 Package  Arch    Version           Repository                             Size
================================================================================
Installing:
 ansible  noarch  2.9.27-1.el8ae    ansible-2-for-rhel-8-x86_64-rpms       17 M
Installing dependencies:
 sshpass  x86_64  1.09-4.el8        rhel-8-for-x86_64-appstream-eus-rpms   30 k

Transaction Summary
================================================================================
Install  2 Packages

Total download size: 17 M
Installed size: 96 M
Is this ok [y/N]:

コマンドラインからは "yum install ansible" と入力しました。"ansible" というモジュールをインストールしようとしています。 色々と調べた結果、"ansible" というツールに加えて、その実行条件となる "sshpass" というライブラリモジュールも(現在の環境には足りてないと判断されて)インストールしようとしている、という場面です。通常はここで "y" と入力してインストール開始、、という流れになると思っています。普通はこの画面にこれ以上着目する必要もないのですが、今回は(たまにはいい機会だと思うので)この画面をもう少し詳しく見てみます。

このピンク色の部分をよく見ると、以下のような挙動を行おうとしていることが分かります:
ansible-2-for-rhel-8-x86_64-rpms リポジトリから ansible-2.9.27-1.el8ae.noarch.rpm をダウンロード(約 17MB
rhel-8-for-x86_64-appstream-eus-rpms リポジトリから sshpass-1.09-4.el8.x86_64.rpm をダウンロード(約 30kB


ではこれらの2つのファイルは具体的にはどこからダウンロードされるのでしょう? その答を調べるにはリポジトリに登録されている情報を調べる必要があります。CentOS や RHEL の場合、"/etc/yum.repos.d/" 以下に ".repo" という拡張子を持つファイルが1つ以上あり、その中にリポジトリの情報が記述されています。

私の環境では "/etc/yum.repos.d/redhat.repo" というファイルが1つだけ存在していて、このファイルの中に全てのリポジトリの情報が含まれていました。その一部だけを紹介しますが、以下のような内容になっていました(一部伏字にしています):
  :
  :
[rhel-8-for-x86_64-baseos-rpms]
name = Red Hat Enterprise Linux 8 for x86_64 - BaseOS (RPMs)
baseurl = https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/dist/rhel8/8.8/x86_64/baseos/os
enabled = 1
gpgcheck = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
sslverify = 1
sslcacert = /etc/rhsm/ca/katello-server-ca.pem
sslclientkey = /etc/pki/entitlement/xxxxxxxxxxxx-key.pem
sslclientcert = /etc/pki/entitlement/xxxxxxxxxxxx.pem
metadata_expire = 86400 enabled_metadata = 1 : : [rhel-8-for-x86_64-appstream-eus-rpms] name = Red Hat Enterprise Linux 8 for x86_64 - AppStream - Extended Update Support (RPMs) baseurl = https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/eus/rhel8/8.8/x86_64/appstream/os
enabled = 1 gpgcheck = 1 gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release sslverify = 1 sslcacert = /etc/rhsm/ca/katello-server-ca.pem sslclientkey = /etc/pki/entitlement/xxxxxxxxxxxx-key.pem
sslclientcert = /etc/pki/entitlement/xxxxxxxxxxxx.pem
metadata_expire = 86400 enabled_metadata = 1 : : [ansible-2-for-rhel-8-x86_64-rpms] name = Red Hat Ansible Engine 2 for RHEL 8 x86_64 (RPMs) baseurl = https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/dist/layered/rhel8/x86_64/ansible/2/os
enabled = 1 gpgcheck = 1 gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release sslverify = 1 sslcacert = /etc/rhsm/ca/katello-server-ca.pem sslclientkey = /etc/pki/entitlement/xxxxxxxxxxxx-key.pem
sslclientcert = /etc/pki/entitlement/xxxxxxxxxxxx.pem
metadata_expire = 86400 enabled_metadata = 1 : :

ピンク色で記載しているのがリポジトリ名です。今回の処理でダウンロード元に指定されている2つのリポジトリがともに含まれていることがわかります(今回はリポジトリファイルが1つだけなので、1つのファイルを確認するだけで分かったのですが、複数のリポジトリファイルが存在している場合は全て調べないと分からない可能性があります)。

ではリポジトリファイルに記載されている情報を使って、目的の2つのファイルをダウンロードしてみます(単にダウンロードするだけなら前回のブログの応用で可能なのですが、今回は yum の仕組みを理解することを目的として wget を使ってダウンロードすることにします)。

では wget を使って2つのファイルをダウンロードしてみます。まずは ansible のファイルをダウンロードしてみます。

yum の実行結果やリポジトリファイルに書かれている情報から、ansible のファイルは ansible-2.9.27-1.el8ae.noarch.rpm というファイル名であることや、このファイルは(リポジトリの baseurl である)以下の文字列を含む URL からダウンロードされることがこの時点で推測できます:
https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/eus/rhel8/8.8/x86_64/appstream/os

では単純に https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/eus/rhel8/8.8/x86_64/appstream/os/ansible-2.9.27-1.el8ae.noarch.rpm という URL からダウンロードできるのでは? という予想もあると思いますが(現にそういう単純なパターンのケースもありますが)、ここはちゃんと調べてみましょう。ここからは wget を併用して調べてみます(手元の PC から直接接続できる URL であれば wget ではなくブラウザを使ってもいいのですが、以下の手順ではネットワークが繋がっていない可能性があることと、鍵ファイルも必要になることから wget を使うことにします。wget の方法で覚えておけば色んなケースに対応できてある意味安心です)。

まずはシンプルに baseurl の値から wget を実行してみます。一般的には baseurl の値に HTTP クライアントでアクセスするとファイルやフォルダの一覧(の HTML)が表示されるので、その画面から次にどの URL にアクセスすればよいか、を推測することができます。

というわけで wget で baseurl の値をヒントにアクセスしてみます:
# wget https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/dist/layered/rhel8/x86_64/ansible/2/os
--2024-01-02 09:59:30--  https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/dist/layered/rhel8/x86_64/ansible/2/os
Resolving rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com (rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com)... 161.xx.xx.xx
Connecting to rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com (rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com)|161.xx.xx.xx|:443... connected.
HTTP request sent, awaiting response... 403 [('PEM routines', 'PEM_read_bio', 'no start line')]
2024-01-02 09:59:30 ERROR 403: [('PEM routines', 'PEM_read_bio', 'no start line')].

おっと、接続はできているのですが 403 エラーが出てしまいました。「権限がない」という意味ですが、これは??

この 403 エラーの原因はリポジトリに記述されていました。改めて ansible-2-for-rhel-8-x86_64-rpms リポジトリの内容を確認してみます:
  :
  :
[ansible-2-for-rhel-8-x86_64-rpms]
name = Red Hat Ansible Engine 2 for RHEL 8 x86_64 (RPMs)
baseurl = https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/dist/layered/rhel8/x86_64/ansible/2/os
enabled = 1 gpgcheck = 1 gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release sslverify = 1 sslcacert = /etc/rhsm/ca/katello-server-ca.pem sslclientkey = /etc/pki/entitlement/xxxxxxxxxxxx-key.pem
sslclientcert = /etc/pki/entitlement/xxxxxxxxxxxx.pem

metadata_expire = 86400 enabled_metadata = 1 : :

よく見ると、この URL にアクセスするには SSL の証明書が必要という情報が書かれていました。この情報が抜けていてアクセスに失敗していたようです。sslcacert は CA 証明書、sslclientkey は秘密鍵、sslclientcert はクライアント証明書で、それぞれのファイルの位置がフルパスで記述されています。

そして wget では以下のオプションを指定することができます:
 ・CA証明書: "--ca-certificate=(ファイルパス)"
 ・秘密鍵: "--private-key=(ファイルパス)"
 ・クライアント証明書: "--certificate=(ファイルパス)"

これらの情報を使い、CA 証明書、秘密鍵、クライアント証明書をそれぞれ指定するオプションを追加して再度先ほどのコマンドを実行してみます:
# wget --ca-certificate=/etc/rhsm/ca/katello-server-ca.pem --private-key=/etc/pki/entitlement/xxxxxxxxxxxx-key.pem --certificate=/etc/pki/entitlement/xxxxxxxxxxxx.pem https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/dist/layered/rhel8/x86_64/ansible/2/os
--2024-01-02 10:19:58--  https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/dist/layered/rhel8/x86_64/ansible/2/os/
Loaded CA certificate '/etc/rhsm/ca/katello-server-ca.pem'
Resolving rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com (rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com)... 161.xx.xx.xx
Connecting to rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com (rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com)|161.xx.xx.xx|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 407 [text/html]
Saving to: ‘index.html’

index.html          100%[===================>]     407  --.-KB/s    in 0s

2024-01-02 10:19:58 (29.8 MB/s) - ‘index.html’ saved [407/407]

今度は成功したようです。wget は text/html のウェブページに対して(ファイル名がないような URL で)実行すると、結果を "index.html" というファイルに保存してくれます。今回も成功して "index.html" というファイルができていたので、その内容を確認すると以下のように記載されていました:
        <!DOCTYPE html>
        <html>
            <body>
                <ul>

                    <li><a href="Packages/">Packages/</a></li>

                    <li><a href="config.repo">config.repo</a></li>

                    <li><a href="repodata/">repodata/</a></li>

                </ul>
            </body>
        </html>

3つのパスへのリンクが含まれる HTML になっていました。一般的にインストールファイルは "Packages/" フォルダ以下にあるので、今度はさっきの URL の後ろに "Packages/" を足して実行してみます:
# wget --ca-certificate=/etc/rhsm/ca/katello-server-ca.pem --private-key=/etc/pki/entitlement/xxxxxxxxxxxx-key.pem --certificate=/etc/pki/entitlement/xxxxxxxxxxxx.pem https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/dist/layered/rhel8/x86_64/ansible/2/os/Packages/
--2024-01-02 10:19:58--  https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/dist/layered/rhel8/x86_64/ansible/2/os/Packages/
Loaded CA certificate '/etc/rhsm/ca/katello-server-ca.pem'
Resolving rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com (rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com)... 161.xx.xx.xx
Connecting to rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com (rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com)|161.xx.xx.xx|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 295 [text/html]
Saving to: ‘index.html.1’

index.html.1        100%[===================>]     295  --.-KB/s    in 0s

2024-01-02 10:34:15 (8.24 MB/s) - ‘index.html.1’ saved [295/295]

今度は "index.html.1" というファイルに結果が保存されたようです。このファイルを確認します:
        <!DOCTYPE html>
        <html>
            <body>
                <ul>

                    <li><a href="a/">a/</a></li>

                    <li><a href="s/">s/</a></li>

                </ul>
            </body>
        </html>

ダウンロードされる .rpm ファイルは "Packages/" フォルダ直下に用意されているケースもありますが、多くの場合(ファイルが多いこともあってか)ファイル名の頭文字がついたサブフォルダの下に用意されているケースが多いです。今回のそのようでこの "Packages/" フォルダには "a/" と "s/" というサブフォルダが用意されていました。今回の目的のファイル名は "ansible-2.9.27-1.el8ae.noarch.rpm" だったので、おそらく "a/" サブフォルダの中に保存されている可能性が高いと推測できます。

というわけで再度、今度は URL の最後に更に "a/" を付けて wget を再実行してみます:
# wget --ca-certificate=/etc/rhsm/ca/katello-server-ca.pem --private-key=/etc/pki/entitlement/xxxxxxxxxxxx-key.pem --certificate=/etc/pki/entitlement/xxxxxxxxxxxx.pem https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/dist/layered/rhel8/x86_64/ansible/2/os/Packages/a/
--2024-01-02 10:19:58--  https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/dist/layered/rhel8/x86_64/ansible/2/os/Packages/a/
Loaded CA certificate '/etc/rhsm/ca/katello-server-ca.pem'
Resolving rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com (rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com)... 161.xx.xx.xx
Connecting to rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com (rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com)|161.xx.xx.xx|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7647 (7.5K) [text/html]
Saving to: ‘index.html.2’

index.html.2        100%[===================>]   7.47K  --.-KB/s    in 0s

2024-01-02 10:43:45 (293 MB/s) - ‘index.html.2’ saved [7647/7647]

今度は "index.html.2" というファイルに結果が保存されたようです。このファイルを確認します:
        <!DOCTYPE html>
        <html>
            <body>
                <ul>

                    <li><a href="ansible-2.8.0-1.el8ae.noarch.rpm">ansible-2.8.0-1.el8ae.noarch.rpm</a></li>

                    <li><a href="ansible-2.8.1-1.el8ae.noarch.rpm">ansible-2.8.1-1.el8ae.noarch.rpm</a></li>

                    <li><a href="ansible-2.8.2-1.el8ae.noarch.rpm">ansible-2.8.2-1.el8ae.noarch.rpm</a></li>

                    <li><a href="ansible-2.8.3-1.el8ae.noarch.rpm">ansible-2.8.3-1.el8ae.noarch.rpm</a></li>

                    <li><a href="ansible-2.8.4-1.el8ae.noarch.rpm">ansible-2.8.4-1.el8ae.noarch.rpm</a></li>

                        :
                        :

                    <li><a href="ansible-2.9.26-1.el8ae.noarch.rpm">ansible-2.9.26-1.el8ae.noarch.rpm</a></li>

                    <li><a href="ansible-2.9.27-1.el8ae.noarch.rpm">ansible-2.9.27-1.el8ae.noarch.rpm</a></li>

                    <li><a href="ansible-2.9.4-1.el8ae.noarch.rpm">ansible-2.9.4-1.el8ae.noarch.rpm</a></li>

                        :
                        :

                    <li><a href="ansible-test-2.9.5-1.el8ae.noarch.rpm">ansible-test-2.9.5-1.el8ae.noarch.rpm</a></li>

                    <li><a href="ansible-test-2.9.6-1.el8ae.noarch.rpm">ansible-test-2.9.6-1.el8ae.noarch.rpm</a></li>

                    <li><a href="ansible-test-2.9.7-1.el8ae.noarch.rpm">ansible-test-2.9.7-1.el8ae.noarch.rpm</a></li>

                    <li><a href="ansible-test-2.9.9-1.el8ae.noarch.rpm">ansible-test-2.9.9-1.el8ae.noarch.rpm</a></li>

                </ul>
            </body>
        </html>

"ansible-2.9.27-1.el8ae.noarch.rpm" 、やっと見つかりました!このフォルダの下にあったんですね。

というわけで最後に "ansible-2.9.27-1.el8ae.noarch.rpm" を URL の最後に追加して wget を実行します:
# wget --ca-certificate=/etc/rhsm/ca/katello-server-ca.pem --private-key=/etc/pki/entitlement/xxxxxxxxxxxx-key.pem --certificate=/etc/pki/entitlement/xxxxxxxxxxxx.pem https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/dist/layered/rhel8/x86_64/ansible/2/os/Packages/a/ansible-2.9.27-1.el8ae.noarch.rpm
--2024-01-02 10:19:58--  https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/dist/layered/rhel8/x86_64/ansible/2/os/Packages/a/ansible-2.9.27-1.el8ae.noarch.rpm
Loaded CA certificate '/etc/rhsm/ca/katello-server-ca.pem'
Resolving rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com (rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com)... 161.xx.xx.xx
Connecting to rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com (rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com)|161.xx.xx.xx|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 17705052 (17M) [application/octet-stream]
Saving to: ‘ansible-2.9.27-1.el8ae.noarch.rpm’

ansible-2.9.27-1.el 100%[===================>]  16.88M  --.-KB/s    in 0.06s

2024-01-02 10:53:08 (270 MB/s) - ‘ansible-2.9.27-1.el8ae.noarch.rpm’ saved [17705052/17705052]

長い道のりを経て、やっと "ansible-2.9.27-1.el8ae.noarch.rpm" がダウンロードできました!

もう1つのファイル "sshpass-1.09-4.el8.x86_64.rpm" も同様にして "rhel-8-for-x86_64-appstream-eus-rpms" リポジトリからダウンロードできます:
# wget --ca-certificate=/etc/rhsm/ca/katello-server-ca.pem --private-key=/etc/pki/entitlement/xxxxxxxxxxxx-key.pem --certificate=/etc/pki/entitlement/xxxxxxxxxxxx.pem https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/eus/rhel8/8.8/x86_64/appstream/os/Packages/s/sshpass-1.09-4.el8.x86_64.rpm
--2024-01-02 10:19:58--  https://rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com/pulp/repos/customer/Library/content/eus/rhel8/8.8/x86_64/appstream/os/Packages/s/sshpass-1.09-4.el8.x86_64.rpm
Loaded CA certificate '/etc/rhsm/ca/katello-server-ca.pem'
Resolving rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com (rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com)... 161.xx.xx.xx
Connecting to rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com (rhha02.updates.jp-tok.iaas.service.xxxxxxxxxx.com)|161.xx.xx.xx|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 30568 (30K) [application/octet-stream]
Saving to: ‘sshpass-1.09-4.el8.x86_64.rpm’

sshpass-1.09-4.el8. 100%[===================>]  29.85K  --.-KB/s    in 0s

2024-01-02 11:07:37 (185 MB/s) - ‘sshpass-1.09-4.el8.x86_64.rpm’ saved [30568/30568]

まとめると、、
・yum コマンドの実行結果にリポジトリの情報が含まれている
・/etc/yum.repos.d/ 以下にリポジトリの URL や鍵に関する情報が含まれている
・これらの情報を組み合わせつつ、wget でフォルダ階層を調べながら目的ファイルの URL を調べていくことでファイルのダウンロードも可能

となります。

NHK が最近また流行りだしたワンクリック詐欺サイトのニュースを流していました:
スマホに「消せないメッセージ」 注意を


(2015/02/06 追記)
NHK のニュースページが消えてしまい、リンク切れになっていたので、同様のニュースを紹介しているページのリンクを貼っておきます:
【注意!】スマホに消せない画面を表示し金を奪うサイトが続出!
(2015/02/06 追記終わり)


ニュースの内容によると、どうもこれは
 ・(アプリとかではなく)特定のウェブページを
 ・スマホを使って
 ・閲覧した瞬間に
起こる仕組みがある、というものでした。

試しに見てボタンをクリックしたら、ではなく、見た瞬間に発生するらしいです。なので詐欺とわかっていても何が起こるかわからないので試してみるのも怖い、、、、ですよね。

せっかくなので(笑)、勇気を出して比較的安全と思われる方法で何をやっているのかを調べてみました。

このニュースで報じられていたサイトは、どうやら http://XXXXX-avnavi.net/ というサイトです(XXXXX 部分は僕の判断で伏せ字にしてます)。 結論から言うと、このサイトは PC のブラウザでアクセスすれば、単に JavaScript の alert が繰り返し表示されるだけの迷惑ページで済むのですが、最初は何が起こるかわからないので PC ブラウザも使いません。Linux 環境から基本の wget でソースコードだけいただきます:
(トップページの HTML ソースコードだけいただいて X.html という名前で保存)
# wget http://XXXXX-avnavi.net/ -O X.html

取り出した内容を vi で表示します。何よりも驚いたのは丁寧でわかりやすいコメントが大量に書かれていました。おかげで何をやっているのか、とても理解しやすかったです(笑)。この姿勢に限っては真似してもいいと思う。

さてその内容ですが、まず最初にこんな JavaScript コードが実行されてました(コメントもそのまま):
<script>
// History API が使えるブラウザかどうかをチェック
if( window.history && window.history.pushState ){
  //. ブラウザ履歴に1つ追加
  history.pushState( "nohb", null, "" );
  $(window).on( "popstate", function(event){
    //. このページで「戻る」を実行
    if( !event.originalEvent.state ){
      //. もう一度履歴を操作して終了
      history.pushState( "nohb", null, "" );
      return;
    }
  });
}
</script>

非常に丁寧なコメントですよね~(苦笑)。実を言うとこの時点で「おや?」と気付くこともあったのですが、その内容は後述します。

肝心な内容は JavaScript で HTML5 の History API が利用できるブラウザかどうかをチェックした上で、popState/pushState を操作して「戻る」を実行しても戻れないように(要するに「戻る」の無効化)操作しています。このページを見て、怖くなって「戻る」を押しても戻れないように予め設定されてしまうのです。用意周到ですね。。

ちなみにここのテクニックに関しては以前に僕のブログエントリでも紹介しています。興味ある方はそちらを参照ください:
HTML5 の pushState/popState でヒストリバックを無効にする


そして、ページを戻れなくした上で行っているのがこちらのコードです。赤字部分は僕が加えた説明コメントです:
<script type="text/javascript">
client_id1 = getCookie('id'); //. クッキーから(別途設定した) ID を取得
console.log("in template"); //. この2行要らないと思う
console.log(client_id1);
var HogeTimer = setInterval("hogemoge()",1000); //. 1秒毎に以下を実行
function hogemoge(){
(この一行があまりにも長くて見にくかったので改行しています。
 問い合わせ先電話番号 NNNNNNNNNNNNN はこちらで伏せ字にしました)

alert('【御登録完了】\nお申込み承諾致しました。\n 動画再生準備完了中。\n\n 【18禁アダルト動画サイト】\n 【365日間の視聴期間】\n\n ★只今お客様還元祭★\n ★キャンペーン期間中で割引適用中★\n 99800円\n 会員ID:' +client_id1 +'\n問い合わせ先\nNNNNNNNNNNNNN\n ※キャンペーン期間内にご精算下さい※\n\n ※誤作動登録の場合※\n →24時間以内に登録削除(自動処理)へご連絡ください。\n\n ※24時間経過後※\n→誤作動登録の場合でもご精算頂きます。');
//. ↑怖いメッセージを表示した後に、、 location.href = "tel:NNNNNNNNNNNNN"; //. スマホの場合、ここで電話をかけようとする

//. 終了しても1秒後にメッセージ表示から繰り返される } </script>

まず別途設定したクッキーを使って、お客様番号っぽい情報を作り、それを取り出します(お客様番号でも何でもありません)。 その直後の console.log 2行は気持ちは分かるけど消しておいた方がいいと思う(苦笑)。

そして JavaScript の setInterval を使って、1000ミリ秒(1秒)毎に実行する処理を指定しています。ここでいう「1秒毎」は、この処理が実行されて、最後まで実行して、そこから1秒たったらまた初めから実行、です。要は1秒の間をとりながら延々と繰り返される処理、ということになります。ここまではよくあるブラクラと同じ原理です。

気になる肝心の処理内容ですが、(1)怖いメッセージを表示して(「OK」ボタンだけ表示されるので押すしかない)、(2)「OK」を押すと(スマホでは)特定の番号に国際電話をかけようとする です。実際には「電話をかけますか?」という確認メッセージが表示されて、かけるかどうかを選択できるのですが、書けずに終了しても、1秒後にまた (1) へ戻るだけです。ちなみに電話をかけても (1)へ戻ります。

「怖い」と感じて、前のページに戻ろうとしても前述のように「戻る」は無効化されています。普通にホームボタンを押してブラウザを閉じてしまうことはできますが、(別の目的で)ブラウザを使おうとすると、履歴が残っているのでまたこの画面に戻ってしまいます。パニックにさせて、「電話をかけるしかないのか?」と思わせようとしてるんですかね。ちなみに電話をかける実験まではしてないので、どういう内容かはわかりません。 (^^;


もしも、間違ってこのページを PC ブラウザで開いてしまった場合は、CTRL+ALT+DEL キーを押してタスクマネージャーを出すなどして、ブラウザごと終了してしまいましょう。

スマホでこのページを見ちゃった場合はこちらのページを参考に履歴ごと消してしまってください:
http://did2memo.net/2013/11/15/iphone-endless-pop-up-message-page/



サイトの仕組みの説明は以上です。この下は気付いた雑感を2つほど。

まず、このページの HTML / JavaScript は非常に読みやすいです、メンテナンスしやすそう(苦笑)。ある意味で優秀なエンジニアが関わってるんだろうなあ、と思いました。デバッグ用と思われる console.log が残っているのはご愛嬌ですが、JavaScript 以外の HTML でも例えばこんな感じの記述がされています:
2015013101


いやあ、わかりやすい(笑)。 <div> でちゃんとパーツ化されている上に HTML コメントが非常に適切で、実際の画面を見なくてもどういうページを作ろうとしているのか想像できます。感心してる場合じゃないけど、これ作った人とは話が合いそう。。 (^^;

そしてもう1つ気になったこと。それは上記で紹介した僕のブログエントリ
HTML5 の pushState/popState でヒストリバックを無効にする

で紹介している JavaScript の内容と、このサイトで実際に使われている JavaScript の内容が変数やコメントの使い方のレベルで非常に似ている、というか似すぎている!? あれ?もしかして参照してくれた!? ということに気付いてしまいました。 良い子はこういう使い方に応用しないでね。 d(o^ )

#念のため補足しておくと、僕が紹介した無効化は問い合わせフォームなどで 入力→確認→送信 みたいなページ遷移をする時に 送信後のページから確認ページに戻られると色々不都合があるので、そういった挙動をさせなくするための手段として紹介したつもりでした。


というわけで、メンテナンス性も含めた色んな意味で意外と完成度の高い詐欺サイトでした。




 

このページのトップヘ