snappy + wkhtmltopdf setup

https://github.com/barryvdh/laravel-snappy

composer require barryvdh/laravel-snappy

// windows
composer require wemersonjanuario/wkhtmltopdf-windows

config/app.php

'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class,
'SnappyImage' => Barryvdh\Snappy\Facades\SnappyImage::class,

https://github.com/KnpLabs/snappy#wkhtmltopdf-binary-as-composer-dependencies

composer require h4cc/wkhtmltopdf-amd64 0.12.x
composer require h4cc/wkhtmltoimage-amd64 0.12.x

config/snappy.php

<?php
return array(
'pdf' => array(
'enabled' => true,
'binary' => base_path(env('SNAPPY_WKHTMLTOPDF_PATH', 'vendor/wemersonjanuario/wkhtmltopdf-windows/bin/64bit/wkhtmltopdf')),
'timeout' => false,
'options' => array(),
'env' => array(),
),
'image' => array(
'enabled' => true,
'binary' => base_path(env('SNAPPY_WKHTMLTOIMAGE_PATH', 'vendor/wemersonjanuario/wkhtmltopdf-windows/bin/64bit/wkhtmltoimage')),
'timeout' => false,
'options' => array(),
'env' => array(),
),
);

.env

SNAPPY_WKHTMLTOPDF_PATH="vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64"
SNAPPY_WKHTMLTOIMAGE_PATH="vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64"

Laravel: CentOS 7

PHP 7.2 – gunakan remi 

wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm rpm -Uvh remi-release-7.rpm epel-release-latest-7.noarch.rpm
yum install yum-utils
yum-config-manager --enable remi-php72
yum update
yum install php php-mbstring php-dom php-gd php-opcache

MariaDB

yum install mariadb-server
sudo systemctl start mariadb
sudo systemctl enable mariadb
sudo mysql_secure_installation

NodeJS & NPM

yum install nodejs
npm install

Composer

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" 
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/bin/composer
composer install

httpd

yum install httpd

CIMB. Isu Kata Laluan

Masalah CIMB yang viral pada pagi ini adalah berkisar dua perkara pokok iaitu:

  1. Dapat log masuk ke dalam sistem CIMB Clicks walaupun kata laluan anda salah
  2. Terdapat caj kepada kad debit melalui PayPal

Penulisan ini bukan berkisar tentang perkara kedua kerana perkara kedua saya tidak mempunyai kefahaman yang begitu jelas bagaimana ia berlaku. Tetapi hanya akan memfokuskan perkara pertama sahaja iaitu dapat log masuk walaupun kata laluan salah.

Fakta kes

Terdapat ramai yang mengatakan bahawa mereka dapat log masuk ke dalam CIMB Clicks walaupun kata laluan yang mereka letak adalah salah. Tetapi jika dilihat secara terperinci kesemua yang mendakwa tersebut berdasarkan satu kenyataan yang ditularkan bahawa jika pengguna menambah aksara (character) selepas aksara kata laluan yang sebenar, maka kata laluan tersebut akan diterima.

Gambar daripada Twitter yang disebar ramai

[ kata laluan sebenar ] + [ aksara tambahan ] = [ kata laluan baru ]

Dalam kata lain, jika Maimunah sebagai contoh mempunyai kata laluan CIMB Clicks iaitu m00n2018 dan dia menambah aksara tambahan iaitu hensem pada kata laluannya menjadi m00n2018hensem maka CIMB akan membenarkannya log masuk ke dalam CIMB Clicks.

m00n2018 + hensem = m00n2018hensem

Secara teknikalnya, CIMB membenarkan pengguna yang memasukkan kata laluan yang salah log masuk ke dalam sistem dan itu adalah satu kerentanan sekuriti sistem yang serius. Kerana sepatutnya sebarang input daripada pengguna tidak boleh dipangkas apatah lagi berkaitan dengan kata laluan. Tetapi daripada kes CIMB saya nampak masih boleh diterima pada ketika ini.

Q: Adakah itu tanda CIMB telah di godam?

A: Tidak. Anda masih memerlukan 8 aksara pertama sebagai kata laluan yang sah untuk log masuk ke dalam sistem. Kata laluan anda masih tidak bertukar cuma input daripada anda ditukarkan oleh sistem CIMB untuk memenuhi keperluan algoritmanya (rujuk bahagian algoritma kata laluan CIMB).

Algoritma Kata Laluan CIMB

Secara jelas disini kemungkinan besar CIMB menggunakan satu algoritma untuk mencincang (hashed) kata laluan dalam bentuk text asal kepada satu text yang lebih komplek yang mempunyai limitasi kepada 8 aksara alpha-numeric sahaja. Ada yang mencadangkan algoritma tersebut adalah DESData Encryption Standard. Disebabkan perkara itu, apabila pengguna memasukkan kata laluan lebih daripada 8 aksara, kata laluan tersebut perlulah dipangkas (truncate) terlebih dahulu menjadi 8 aksara sahaja bagi membolehkan algoritma tersebut berjalan.

Seperti contoh Maimunah tadi, walaupun kata laluan yang dimasukkan adalah m00n2018hensem tetapi apabila dihantar kepada sistem, CIMB telah memangkas input tersebut menjadi m00n2018 sahaja dan secara kebetulan sama seperti kata laluan asalnya dan apabila dicincang, hasil cincangannya adalah sama seperti cincangan asal. Dengan itu membolehkan sistem membenarkan pengguna tersebut log masuk ke dalam sistem.

Pelbagai jenis algortima

Terdapat pelbagai jenis algoritma yang wujud di dalam dunia ini. Masing-masing mempunyai kepelbagaian, kebaikkan dan kekurangan untuk disesuaikan dengan kes setiap sistem. Seperti contoh DES adalah satu salah algoritma yang wujud. Contoh lain adalah md5, Mcrypt, Bcrypt dan yang sedang meningkat naik sekarang adalah Argon2ID. Setiap algoritma ini akan menghasilkan cincangan yang berlainan walaupun kata asalnnya adalah sama. Seperti contoh hasil cincangan untuk perkataan “test”:

JenisHasil
md5098f6bcd4621d373cade4e832627b4f6
Bcrypt$2y$10$gZQewKePBNvFY91sx9U6yO5Vjtc0qwOBN9RL5YG0Rx0DMT1IcbpTS
Argon2I$argon2i$v=19$m=2048,t=4,p=3$RkVZeVVEQWY2T2lsVHVlNg$rPnuhDtu0dofpWfoeh4ENTtm3EcYIXy5ZPeFxvboqNs

Daripada pemerhatian saya, CIMB kini mempunyai setidaknya dua jenis algortima yang kita boleh kategorikan kepada:

  1. Algo lama
  2. Algo baru

Algo lama adalah algoritma yang digunakan oleh pengguna yang mempunyai masalah boleh-log-masuk-walaupun-kata-laluan-salah sejak pagi tadi. Kemungkinan besar dahulu tiada masalah untuk menggunakan algoritma ini kerana terhad kepada 8 aksara sahaja dan penjanaan cincangan yang laju untuk pengesahan pengguna. Akan tetapi kelemahannya adalah terhad kepada 8 aksara input, hanya boleh menerima input alpha-numeric sahaja bermaksud tiada karakter khas seperti [email protected]#$% boleh digunakan sebagai kata laluan. Ini juga merupakan satu isu sekuriti yang mana sepatutnya pada kita menuju ke zaman kereta terbang, kata laluan tidak hanya terhad kepada alpha-numeric sahaja apatah lagi terhad kepada 8 aksara.

Algo baru adalah algoritma yang digunakan oleh CIMB Click sekarang ini. Disebabkan keperluan semasa, maka pengguna boleh menentukan panjang kata laluan sendiri diantara 8 hingga 20 aksara dan memasukkan karakter khas ke dalam kata laluan. Bukan hanya alpha-numeric sahaja seperti algo lama. Mungkin kelemahan algoritma ini memerlukan sumber perkomputeran yang lebih tinggi (sekitar beberapa milisecond, mungkin microsecond dan keperluan memori yang lebih tinggi mungkin sekitar 1-2 kilobyte) daripada algo lama. Walaupun kecil bagi pengguna biasa, tetapi untuk skala besar seperti bank setiap sumber itu amat berharga apatah lagi masa. Tetapi mungkin dengan kemampuan perkomputeran yang lebih baik, masalah ini telah diatasi kini.

Maka pengguna CIMB sekarang ini sedang di dalam fasa pemindahan daripada algo lama kepada algo baru. Perkara yang aku kurang pasti adakah pihak CIMB tidak memberikan notis awal kepada penggunanya untuk bersedia dalam penukaran kata laluan ini. Penafian: Saya tak guna CIMB Click.

Q: Adakah algoritma lain mempunyai had input seperti algo lama?

A: Ada. Contohnya Bcrypt hanya mengambil 72 karakter input sahaja dan membuat pangkasan kepada karakter yang selebihnya.

contoh di mana cincangan yang dicipta oleh brcypt adalah sama untuk teks yang melebihi 72 aksara.

Had tersebut dibuat untuk mempercepatkan proses cincangan dimana rata-rata maksima kata laluan pengguna adalah sekadar 64 aksara dan juga mengurangkan masa, keperluan komputer seperti CPU dan memori. Walaupun OWASP mencadangkan had maksima kata laluan boleh menjangkau sehingga 128 aksara.

Q: Jika saya tukar kepada kata laluan kepada algo baru, adakah selepas itu CIMB akan masalah “kata laluan betul walaupun salah” ini akan berlaku lagi?

A: Sepatutnya tidak, kerana keperluan kedua-dua algo tersebut adalah berlainan. Melainkan jika algo baru juga mempunyai had input maksima yang pendek iaitu 20 dan akan datang jika had kata laluan di naikkan kepada 30, maka masalah ini akan berlaku lagi.

Q: Jika ada dua algoritma, macam mana CIMB tahu algoritma mana nak guna untuk kata laluan saya?

A: Perkara ini saya tidak dapat terangkan lebih lanjut kerana info terperinci lebih diketahui oleh pihak CIMB. Tetapi selalunya kita akan membezakannya berdasarkan “tandatangan” yang dicipta semasa kita mencincang input tersebut seperti contoh di atas; bcrypt menggunakan $2y sebagai tandatangan dan argon2 menggunakan $argon2i. Dengan ini sistem sepatutnya boleh mengetahui apakah jenis algortima yang perlu digunakan untuk menyemak adakah kata laluan yang diisi oleh pengguna itu sama dengan yang disimpan di dalam pangkalan data.

Q: Ada yang kata CIMB tak cincang kata laluan tetapi letak sebagai teks asal (plain text).

A: Perkara ini juga saya tidak dapat sahkan kerana itu perlu melihat terus ke dalam pangkalan data CIMB. Tetapi saya lihat masalah aksara tambahan tersebut boleh berlaku sama ada input dicincang mahupun tidak dicincang maka saya meletakkan harapan bahawa CIMB menyimpan data kata laluan penggunanya dengan betul.

Termasuklah data yang hilang dahulu.

Q: Kenapa saya masih boleh log masuk guna kata laluan lama.

A: Pihak CIMB tidak menukarkan secara automatik kata laluan anda daripada cincangan lama kepada yang baru di atas beberapa perkara (saiz input, peraturan kata laluan baharu, ralat pada tekaan, dll.) dan keadaaan yang memungkinkan berlakunya kesilapan. Maka mereka memerlukan anda untuk membuat penukaran kata laluan secara manual. Apabila keadaan panik ini sudah reda, sila tukar kata laluan anda kepada yang lebih baik, sepanjang yang boleh.

Q: Adakah algo lama (DES) menyebabkan CIMB mudah di godam?

A: Saya tidak nampak sebarang kaitan tentang perkara tersebut buat masa ini.

Q: Berapakah had yang sesuai untuk saya letak kata laluan baru saya?

Sekurang-kurangnya 10 aksara kerana 8 sebenarnya adalah kata laluan yang lemah. Jika mampu panjangkan kepada 20.

Kesimpulan

Masalah penukaran algoritma ini menyebabkan pihak pengguna menjadi panik. Apatah lagi melibatkan duit. Tidak pasti adakah maklumat telah disampaikan sepenuhnya sebelum langkah penukaran tersebut diambil.

Saya tak bercadang menerangkan tentang bruteforce untuk bypass reCaptcha, man-in-middle attack pada TAC SMS server, buffer overflow dan sebagainya kerana saya tiada pengetahuan tentang itu. Kita serahkan pada yang pakar.

Laravel, date & sqlsrv

Kes: Aku gunakan Laravel, database sqlsrv yang diletakkan di dalam Docker kerana gunakan MacOS. Aku perlu dapatkan data daripada medan berjenis date atau datetime eg created_at.

Apabila aku tarik data daripada sistem, jenis format yang dikeluarkan tidak dalam bentuk biasa iaitu, Jan 10 2018 12:00:00:AM. Selalunya apa yang akan dikeluarkan adalah seperti 2018-01-10 atau 2018-01-10 12:00:00. Masalah ini tidak berlaku jika kita buat direct query kepada database. Tetapi hanya apa bila melalui eloquent.

Install pdo_sqlsrv. Untuk itu, aku rujuk kepada laman microsoft sendiri.

Kemudian apabila buat query sekali lagi akan keluar error lain pula. pdo_sqlsrv_db_handle_factory: Unknown exception caught.

Untuk masalah itu aku rujuk kepada komen di dalam github ini. Selepas itu tiada masalah.

Laravel Primary Key As String

Ada ketika primary key kita akan gunakan string bukannya integer maka kita perlu beritahu di dalam model bahawa “laravel, sila casting primary key ini sebagai string” jika tidak secara lalainya adalah integer.

Contoh kes. Primary key kita adalah seperti ini:

338243066987929_338331833652219

Apabila kita menggunakan eloquent untuk mengeluarkan primary key tersebut, key tersebut akan terputus apabila terjumpa karakter bukan nombor dan menjadi seperti ini:

338243066987929

Apa yang kita perlu buat adalah tetapkan di dalam model, casting untuk primary key tersebut adalah string.

protected $casts = [
'id' => 'string',
];

Maka primary key tersebut akan dikeluarkan dengan betul selepas itu.

4 Teori

Dapatan aku daripada permainan Kerbal Space Program, aku berpendapat terdapat 3 perkara yang mungkin terjadi kenapa perkara seperti gambar di bawah terjadi. Tetapi merujuk kepada satu perkara yang sama iaitu daya angkat.

  1. Tekanan atmosfera yang rendah
  2. Masalah enjin yang tidak memberikan daya angkat
  3. Masalah aerodinamik
  4. Berat berlebihan

Tekanan atmosfera yang rendah dapat kita abaikan kerana mengikut laporan pihak di sana, cuaca baik.

Masalah enjin mungkin berlaku atas beberapa sebab seperti enjin memang tidak berfungsi dengan baik, enjin tiba-tiba rosak atas beberapa perkara seperti mekanikal mahupun kesan luaran (kemasukkan burung dan sebagainya)

Masalah aerodinamik yang mungkin juga berlaku atas sebab mekanikal (fatigue) mahupun kesan luaran (burung, banggunan). Tetapi kita boleh mengabaikan kesan fatigue kerana pesawat ini amat baru.

Berat berlebihan yang salah perkiraan juga mungkin berlaku tetapi sepatutnya hal tersebut telah lama dimasukkan ke dalam SOP penerbangan dan dengan pesawat yang baru sebegitu aku rasa sudah lebih canggih sistemnya. Kita tolak ketepi, tetapi jangan abaikan.

Nota: Aku tidak meletakkan sebarang kata kunci khas yang merujuk kepada kemalangan tersebut kerana ini hanya pendapat sendiri. Tiada sebarang nombor-nombor yang boleh dikeluarkan sebagai sandaran.