その昔ネットショップ制作詐欺にかかった振りしてみた話
今朝のワイドショー見てて思い出した。
私のところによりにもよってネットショップ制作詐欺の案内の電話が来たことがありました。orz
- 好きなもの選んでネット上でセレクトショップ作ってもらってOK
- 仕入れ、在庫の手間不要
- 最初にサーバを数万円でセットアップ
- 月何万円で運営代行
- 既に儲かってる人が指導してくれますw
- んで、私幾ばくか儲かるそうな
とツッコむ隙もなくテンプレ捲し立てられてたんですが、聞きながら脳内で軽くツッコんでましたw
なんで脳内で留めてたかって言葉に出してツッコむとそこで電話ガチャ切りされて、楽しめなさそうだったし、
最初に「こちらWebプログラマなんですが」と言ったのにメチャクチャ営業トーク頑張ってるので、労力には報いてあげよう と成層圏からの上から目線で思っちゃったのでしたw
- 好きなもの選んでネット上でセレクトショップ作ってもらってOK → ほんとか?仕入れ品の販路は?
- 仕入れ、在庫の手間不要 → いや発送やら何やら誰かに代行させるの?タダで働くバカいないでしょ?
- 最初にサーバを数万円でセットアップ → 高ぇよ! こっちで月$3のAWSで建てるから、ファームウェアよこせよ
- 月何万円で運営代行 → だから、高ぇよ! どこのこうきゅうなサーバ使ったらそんな金額になるんだよ
- 既に儲かってる人が指導してくれますw → だからその人も幾ばくか取るでしょ?タダで働くバカいないでしょ?
- んで、幾ばくか儲かるそうな → ええ、御社がだろ。 私が儲かる要素無いんですがww
取り敢えず最後まで聞いちゃったんですが
最初にサーバを数万円でセットアップ
「すみませんそんなお金用意できないんで(=「売上が発生する前からみかじめ取るの、自分で言ってておかしいと思わないのか?まさかお前そのデスク自前で買ってて、更にショバ代電話代他を会社に払ってんのかw」を意訳)」で断ることができました。
しかもこれ、「ネットショップ 副業 詐欺」でググると2019年更新の記事がサクサク掛かってくるのですが
何が凄いっていまの所属で勤続8年なので、少なくともその更に2,3年前の話。このパターンで10年やれてるってことなんです。
滅べばいいのに。
PDFLibをmac上のLAMP環境で試してみた
頭の中はすっかり年末です。
さて諸般の事情で、PDFLibとPHPによる電子署名を試してみることにしました。
の3製品を使います。
そして、PLOPの方が2019/12/11現在PHP7.2まで対応しているので、すべての作業にかかる前にPHPのバージョンを合わせておきます。
PDFLibは、ここから所定のプラットフォームのアーカイブをダウンロード。
Macの場合.dmgファイルですが、この中のbindフォルダ配下から該当のバージョンのフォルダの中の php_pdflib.so ファイルをPHPのextensionファイル(/usr/local/lib/php/extensions/ とか)に配置したうえ、php.iniに
とか記述します。
PLOPも同様に所定のプラットフォームのアーカイブをダウンロード。
同様にMacの場合.dmgファイルですが、この中のbindフォルダ配下から該当のバージョンのフォルダの中の php_pdflib.so ファイルをPHPのextensionファイル(/usr/local/lib/php/extensions/ とか)に配置したうえ、php.iniに
とか記述します。
ここまで対応してapacheを再起動すると、phpinfoにこの様によしなに記述されるはずです。
phpinfoに記述されない場合は、php7.2なら
・php-720
・php-720-nts
とフォルダ分けがされていると思うので、このntsがついた方を試すと幸せかもです。
電子署名を入れるサンプルはこちら。
んで今回のオーダーはここから、署名バージョンを重ねないとならないのでした。
このソースを2ファイル作って、後ろのファイルでは既に署名のついたファイルを元ファイルとして読み込み…
よっしゃ。これが tcpdf ではできないんだ。
教訓。お金さえかければなんとかなることもある!w
AWS Lightsailで独自ドメイン入れたらgetimagesizeでConnection refusedした話
仕様要件
AWS Lightsail上のAmazon Linuxにて運用。
Lightsail側で独自ドメイン適用。
あとmod_rewriteと.htaccessで強制SSL。
画像群は同一サーバに置く。S3は使わない。
同一サーバ内の画像フォルダの画像をギャラリー表示したいオーダー。
今回は画像のギャラリーにPhotoSwipeを利用。
このリンクの「How to build an array of slides from a list of links」を適用したかったので
<div class="my-gallery" itemscope itemtype="http://schema.org/ImageGallery"> <figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject"> <a href="large-image.jpg" itemprop="contentUrl" data-size="600x400"> <img src="small-image.jpg" itemprop="thumbnail" alt="Image description" /> </a> <figcaption itemprop="caption description">Image caption</figcaption> </figure> <figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject"> <a href="large-image.jpg" itemprop="contentUrl" data-size="600x400"> <img src="small-image.jpg" itemprop="thumbnail" alt="Image description" /> </a> <figcaption itemprop="caption description">Image caption</figcaption> </figure> </div>
こんな感じの記述が要求されていた。なに?画像の縦横のサイズをよこせとな?
ならばと、画像群を格納したarrayを回し
<?php foreach($photos as $key => $value):?> <?php $picture_size = getimagesize((empty($_SERVER["HTTPS"]) ? "http://" : "https://") . $_SERVER['HTTP_HOST'].$value);?> <figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject"> <div class="thumb photo_gallery_item" style="background-image:url(<?=$value?>)" href='<?=$value?>' data-size="<?=$picture_size[0]?>x<?=$picture_size[1]?>"> <a href='<?=$value?>' itemprop="contentUrl" > </a> <img src="<?=$value?>" itemprop="thumbnail" alt="" style='display:none;' /> </div> </figure> <?php endforeach;?>
こうやってみた。
<?php $picture_size = getimagesize((empty($_SERVER["HTTPS"]) ? "http://" : "https://") . $_SERVER['HTTP_HOST'].$value);?>
この行で叱られました。orz
A PHP Error was encountered Severity: Warning Message: getimagesize(http://独自ドメイン/画像.jpg): failed to open stream: Connection refused
imgタグの中身のは出てくるんです。
<?php $picture_size = getimagesize("https://" . $_SERVER['HTTP_HOST'].$value);?>
強制SSLにしたのでこうしたが、改善されずorz
試しにサーバに入りwgetで画像のURLを叩くも、自分のサーバの443ポートが開いてない様なお叱りをいただく。
確かにawsのロードバランサの仕様はそれでいいんだが…
画像群は同一サーバに置く。S3は使わない。
そうでした。今回はこれでした。
同じサーバなんだからサーバ内の絶対パスにすれば解決じゃない。
<?php //$picture_size = getimagesize((empty($_SERVER["HTTPS"]) ? "http://" : "https://") . $_SERVER['HTTP_HOST'].$value);?> <?php $picture_size = getimagesize( FCPATH .$value);?>
FCPATH は /var/www/html などのCIのインストールフォルダです。
これで、事なきを得ました。
さてもう年の瀬ですよっと。
週末はもう世田谷ボロ市、その次の週末は冬至、いとこ煮食べたらあっという間にガキの使いです。
でもあまり追い詰められてる感はない、というか年々追い詰められてる感が薄れていく。何故だw
INTL_IDNA_VARIANT_2003がdeprecatedしたので対策
やっとホームグラウンドのLAMPに戻って来ました。そしたら
Severity: 8192 --> idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated /system/libraries/Email.php 1856
まあCIのバージョンが少し古かったんですが、PHP本家を参照するとこのような話でした。
https://www.php.net/manual/ja/migration72.deprecated.phpwww.php.net
INTL_IDNA_VARIANT_2003 バリアント
Intl 拡張モジュール では、INTL_IDNA_VARIANT_2003 バリアントは非推奨になりました。 これは idn_to_ascii() および idn_to_utf8() 関数の デフォルト値として現在使われています。PHP 7.4 ではこのデフォルト値が INTL_IDNA_VARIANT_UTS46 に変更される予定ですし、 PHP の次のメジャーバージョンアップでは、 INTL_IDNA_VARIANT_2003 が削除される予定です。
とのことなので、デフォルト値なら明示的に変更すればいいじゃない。関数のusageを参照
https://www.php.net/manual/ja/function.idn-to-ascii.phpwww.php.net
idn_to_ascii ( string $domain [, int $options = 0 [, int $variant = INTL_IDNA_VARIANT_2003 [, array &$idna_info ]]] ) : string
variant
IDNA 2003 の場合は INTL_IDNA_VARIANT_2003、あるいは UTS #46 の場合は INTL_IDNA_VARIANT_UTS46。
これで該当箇所を補います。
/system/libraries/Email.php *バージョンにより厳密な行番号が異なる場合があるので行番号は割愛
/** * Email Validation * * @param string * @return bool */ public function valid_email($email) { if (function_exists('idn_to_ascii') && $atpos = strpos($email, '@')) { $email = self::substr($email, 0, ++$atpos).idn_to_ascii(self::substr($email, $atpos), 0, INTL_IDNA_VARIANT_UTS46); } return (bool) filter_var($email, FILTER_VALIDATE_EMAIL); }
/** * Validate email for shell * * Applies stricter, shell-safe validation to email addresses. * Introduced to prevent RCE via sendmail's -f option. * * @see https://github.com/bcit-ci/CodeIgniter/issues/4963 * @see https://gist.github.com/Zenexer/40d02da5e07f151adeaeeaa11af9ab36 * @license https://creativecommons.org/publicdomain/zero/1.0/ CC0 1.0, Public Domain * * Credits for the base concept go to Paul Buonopane <paul@namepros.com> * * @param string $email * @return bool */ protected function _validate_email_for_shell(&$email) { if (function_exists('idn_to_ascii') && $atpos = strpos($email, '@')) { $email = self::substr($email, 0, ++$atpos).idn_to_ascii(self::substr($email, $atpos), 0, INTL_IDNA_VARIANT_UTS46); } return (filter_var($email, FILTER_VALIDATE_EMAIL) === $email && preg_match('#\A[a-z0-9._+-]+@[a-z0-9.-]{1,253}\z#i', $email)); }
/system/libraries/Form_validation.php
/** * Valid Email * * @param string * @return bool */ public function valid_email($str) { if (function_exists('idn_to_ascii') && preg_match('#\A([^@]+)@(.+)\z#', $str, $matches)) { $str = $matches[1].'@'.idn_to_ascii($matches[2], 0, INTL_IDNA_VARIANT_UTS46); } return (bool) filter_var($str, FILTER_VALIDATE_EMAIL); }
Apple IDの2ステップ認証と2ファクタ認証の違いが把握できず苦労した
さて、App Store Connect、Apple Developer Center などで作業する際に、iPhone上で何やら訊かれるようになりました。
この下の画面の確認コードをブラウザで入力しないと何もできませぬ。
この人が2ファクタ認証というものです。
で、我々はクライアント殿よりiOSアプリのロンチ、プッシュ通知など諸々の情報をApple Developer Centerから貰っていただきたかったのが、通知が飛ばず入れないとおっしゃられてしまうのでした。orz
Apple IDが同じならその端末のどれかに飛ぶ筈ですし、testflightの通知は飛んでる筈なんです。
肝心の2ファクタ認証はiOS端末側で設定する筈なんですが、我々の端末で確認してもちゃんと設定メニューがある。
あまりに話が通じないので端末を見せていただいて確認したところ、クライアント殿のApple IDで2ステップ認証が設定されておりました。
そりゃわかんねえよ。確かにこんなところプログラマじゃなきゃ見ねえよ。だいたい、呼び名がややこしい!!orz
ひとまず、事なきを得た模様です。お客さん逆ギレしなくたっていいじゃないかorz
なおまるっきり同じ轍を踏んでいた記事