2019年8月23日 星期五

PHP import reCAPTCHA v3

早上得到反映Google reCAPTCHA循環出現輸入錯誤無法通過的消息,檢查中發現已經更新到 v3,他跟前代最大的差別就是不用再要求使用者與頁面互動,貌似會依照行為來計算分數判斷是否為機器人所為!!

套用步驟如下。
1. 申請KEY,進入此網站點選右上角進入Admin Console,依照步驟取得網站金鑰跟密鑰
 

2. 登入頁(HTML)

HEAD:
<script src="https://www.google.com/recaptcha/api.js?render=網站金錀"> </script>
<script>
grecaptcha.ready(function() {
  grecaptcha.execute('網站金錀', {action: 'homepage'}).then(function(token) {
    var recaptchaResponse = document.getElementById('recaptchaResponse');
    recaptchaResponse.value = token;
  });
});
</script>

FORM:
<input type="hidden" value="" name="recaptcha_response" id="recaptchaResponse">

3. 驗證頁(PHP)

if ( !$_POST ) exit;

$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_secret = '密鑰';
$recaptcha_response = $_POST['recaptcha_response'];
//Make and decode POST request:
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response);
$recaptcha = json_decode($recaptcha);
if($recaptcha->success==true){
   if($recaptcha->score >= 0.5) {
       //PASS
   } else {
       //BOT
   }
} else {
   //FAIL
}

4. 檢查~套用v3的頁面右下角會出現Google reCAPTCHA圖示,若無則表示有缺漏得檢查。

2019年8月2日 星期五

大量Time_wait的改善紀錄

因為AP架構設計的緣故,做了個Agent處理在Listen伺服器上檢查是否有需要處理的作業,頻繁的連線>檢查>關閉的作業,在客戶端Agent多的狀況下在伺服器端就會發現有許多Time_wait紀錄,這樣會造成WEB服務上的效能變差。

編輯 vim /etc/sysctl.conf

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

然後執行  /sbin/sysctl -p 套用
  • net.ipv4.tcp_syncookies = 1 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,默認為0,表示關閉;
  • net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉;
  • net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
  • net.ipv4.tcp_fin_timeout 修改系統默認的 TIMEOUT 時間
若是卡點在對資料庫的連線,那麼寫個shell script來kill process才能改善,單純結束連線解決不了問題。

define('MAX_SLEEP_TIME', 120);  

$hostname = "xxx";  
$username = "xxx";  
$password = "xxx";  

$err_level = error_reporting(0);
$connect = mysql_connect($hostname,$username,$password);
error_reporting($err_level); 
$result = mysql_query("SHOW PROCESSLIST", $connect);  
while ($proc = mysql_fetch_assoc($result)) {  
  if ($proc["Command"] == "Sleep" && $proc["Time"] > MAX_SLEEP_TIME) {  
    @mysql_query("KILL " . $proc["Id"], $connect);  
  }  
}   
mysql_close($connect);  

2019年8月1日 星期四

aliyun push to android 8 up 備忘

相關資源:
https://github.com/aliyun/alicloud-ams-demo/tree/master/OpenApi2.0/push-openapi-php-demo

這陣子在處理阿里推送上在Android 8裝置會收不到的狀態卡了許久,使用PushNoticeToAndroidRequest.php來進行推送都很迅速地在Android 8以下裝置收到,若是透過阿里後台的推送則全裝置都能順利收到,這就不會是APP設計的問題。

這部分問題要爬文建議透過百度搜尋來查找,比Google來的更豐富且針對些,應該是阿里雲屬於內地的產品吧! 即便在那斯達克上市也不能免俗。

總之關鍵點在於...以下參考~

//XXX必須與APP設定的一致
$request_android->setAndroidNotificationChannel("XXX");

ExtParameters設定:
//這是透過 PushNoticeToAndroidRequest.php 使用的設定
$request->setAndroidExtParameters("{\"key1\":\"value1\",\"api_name\":\"PushNoticeToAndroidRequest\"}");  

//這是透過 PushRequest.php 使用的設定
$request->setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}"); 

//若設定成ALL則IOS相關設定需帶入
$request->setDeviceType("ANDROID");   

//這設定貌似也要加~不過數字上沒甚麼感覺
$request->setAndroidNotificationBarType(1);     //通知栏自定义样式0-100
$request->setAndroidNotificationBarPriority(1);     //通知栏自定义样式0-100

小結: 許多阿里後台端的問題都需有內地帳號才能發問(這個在台灣手機認證上就掛了),所以即便是呼叫OPENAPI順利得到MessageID對於"沒收到"這檔是也是無濟於事,打轉許久只能透過Try & Error排除。

另外曾考慮透過Dot NET來呼叫OPENAPI,不過在帶入appkey那行總是編譯失敗,nullable long<n> 未定義,改用建議的DLL會造成更多的變數定義錯誤,這是就神奇了~~目前無解。

補充:使用PushNoticeToAndroidRequest設定NotificationChannel沒意義,追蹤相關的code看來沒支援/強制寫入固定值在回傳的陣列裡也是靜悄悄,所以用PushRequest.php來推送即可。