我在websocket的鏈接里加了個參數(shù)類似下面:
ws://127.0.0.1:8019/?sid=3670549-360dMrtp
然后服務端 onConnect 方法里做了如下驗證:
$worker->onConnect = function (\Workerman\Connection\TcpConnection $connection) {
try {
$connection->uniqueId = $connection->getLocalIp() . '-' . $connection->getLocalPort() . '-' . $connection->worker->id . '-' . $connection->id;
$connection->onWebSocketConnect = function (\Workerman\Connection\TcpConnection $connection, $http_header) {
if (
!isset($_SERVER['HTTP_ORIGIN']) ||
($_SERVER['HTTP_ORIGIN'] != 'http://local.tieba.com:8018' && $_SERVER['HTTP_ORIGIN'] != 'https://tieba.baidu.com')
) {
throw new Exception('鏈接unique_id=' . $connection->uniqueId . ',鏈接參數(shù) HTTP_ORIGIN 錯誤', 1025);
}
if (!isset($_GET['sid']) || !$_GET['sid']) {
throw new Exception('鏈接unique_id=' . $connection->uniqueId . ',鏈接參數(shù)錯誤,sid為空', 1026);
}
$connection->sid = $_GET['sid'];
};
$connection_ip = $connection->getRemoteIp();
$connection->maxSendBufferSize = 10485760;
if ($connection_ip) {
if (in_array($connection_ip, $GLOBALS['ip_black_list'])) {
throw new Exception('ip=' . $connection_ip . ',unique_id=' . $connection->uniqueId . ' 的用戶已被加入到ip黑名單,直接關閉該鏈接', 1027);
}
if (isset($GLOBALS['ip_list'][$connection_ip])) {
if ($GLOBALS['ip_list'][$connection_ip]['num'] >= ONE_IP_MAX_WEBSOCKET_NUM) {
$GLOBALS['ip_black_list'][] = $connection_ip;
throw new Exception('ip=' . $connection_ip . ',unique_id=' . $connection->uniqueId . ' 的用戶超過了最大鏈接數(shù),直接關閉該鏈接', 1029);
}
$GLOBALS['ip_list'][$connection_ip]['num'] += 1;
} else {
$GLOBALS['ip_list'][$connection_ip]['num'] = 1;
}
}
} catch (Exception $exception) {
$connection->close_reason = $exception->getMessage() . ':' . $exception->getCode();
$connection->close("\r\n");
}
wlog('new connection ' . $connection->uniqueId . ' from ip ' . $connection_ip, false, 1, $GLOBALS['system_set']);
};
上面的代碼沒有問題,嘿嘿,但是如果鏈接改成了:
ws://127.0.0.1:8019/?sidx=3670549-360dMrtp
我原本的意思是沒有驗證到 sid 參數(shù),應該輸出一個log并且關閉這個鏈接,然后沒啥事了,但是現(xiàn)在是程序老是報一大堆的錯誤,如下,我檢查了半天感覺我的業(yè)務代碼是沒有什么問題的,想請大神們幫我看下是不是框架有問題了?
[2021-07-14 15:38:31] new connection 172.17.0.2-8910-0-1 from ip 172.17.0.1
2021-07-14 15:38:31 pid:1569 Exception: 鏈接unique_id=172.17.0.2-8910-0-1,鏈接參數(shù)錯誤,sid為空 in /var/www/diary/server/WorkermanWebsocketServer.php:116
Stack trace:
#0 /var/www/diary/lib/Workerman/Protocols/Websocket.php(392): {closure}()
#1 /var/www/diary/lib/Workerman/Protocols/Websocket.php(57): Workerman\Protocols\Websocket::dealHandshake()
#2 /var/www/diary/lib/Workerman/Connection/TcpConnection.php(600): Workerman\Protocols\Websocket::input()
#3 /var/www/diary/lib/Workerman/Events/Select.php(294): Workerman\Connection\TcpConnection->baseRead()
#4 /var/www/diary/lib/Workerman/Worker.php(2419): Workerman\Events\Select->loop()
#5 /var/www/diary/lib/Workerman/Worker.php(1543): Workerman\Worker->run()
#6 /var/www/diary/lib/Workerman/Worker.php(1373): Workerman\Worker::forkOneWorkerForLinux()
#7 /var/www/diary/lib/Workerman/Worker.php(1347): Workerman\Worker::forkWorkersForLinux()
#8 /var/www/diary/lib/Workerman/Worker.php(1680): Workerman\Worker::forkWorkers()
#9 /var/www/diary/lib/Workerman/Worker.php(1629): Workerman\Worker::monitorWorkersForLinux()
#10 /var/www/diary/lib/Workerman/Worker.php(544): Workerman\Worker::monitorWorkers()
#11 /var/www/diary/server/WorkermanWebsocketServer.php(181): Workerman\Worker::runAll()
#12 {main}
2021-07-14 15:38:31 pid:1569 Worker[1569] process terminated
Warning: (null)(): supplied resource is not a valid stream resource in Unknown on line 0
Call Stack:
0.0004 1382960 1. {main}() /var/www/diary/server/WorkermanWebsocketServer.php:0
0.0172 2878392 2. Workerman\Worker::runAll() /var/www/diary/server/WorkermanWebsocketServer.php:181
0.0486 2980704 3. Workerman\Worker::monitorWorkers() /var/www/diary/lib/Workerman/Worker.php:544
0.0486 2980704 4. Workerman\Worker::monitorWorkersForLinux() /var/www/diary/lib/Workerman/Worker.php:1629
108.0958 2982184 5. Workerman\Worker::forkWorkers() /var/www/diary/lib/Workerman/Worker.php:1680
108.0958 2982184 6. Workerman\Worker::forkWorkersForLinux() /var/www/diary/lib/Workerman/Worker.php:1347
108.0958 2982184 7. Workerman\Worker::forkOneWorkerForLinux() /var/www/diary/lib/Workerman/Worker.php:1373
108.0980 2981432 8. Workerman\Worker->run() /var/www/diary/lib/Workerman/Worker.php:1543
108.1004 3034448 9. Workerman\Events\Select->loop() /var/www/diary/lib/Workerman/Worker.php:2419
118.1001 3203544 10. Workerman\Connection\TcpConnection->baseRead() /var/www/diary/lib/Workerman/Events/Select.php:294
118.1001 3204184 11. Workerman\Protocols\Websocket::input() /var/www/diary/lib/Workerman/Connection/TcpConnection.php:600
118.1002 3204184 12. Workerman\Protocols\Websocket::dealHandshake() /var/www/diary/lib/Workerman/Protocols/Websocket.php:57
Warning: (null)(): supplied resource is not a valid stream resource in Unknown on line 0
Call Stack:
0.0004 1382960 1. {main}() /var/www/diary/server/WorkermanWebsocketServer.php:0
0.0172 2878392 2. Workerman\Worker::runAll() /var/www/diary/server/WorkermanWebsocketServer.php:181
0.0486 2980704 3. Workerman\Worker::monitorWorkers() /var/www/diary/lib/Workerman/Worker.php:544
0.0486 2980704 4. Workerman\Worker::monitorWorkersForLinux() /var/www/diary/lib/Workerman/Worker.php:1629
108.0958 2982184 5. Workerman\Worker::forkWorkers() /var/www/diary/lib/Workerman/Worker.php:1680
108.0958 2982184 6. Workerman\Worker::forkWorkersForLinux() /var/www/diary/lib/Workerman/Worker.php:1347
108.0958 2982184 7. Workerman\Worker::forkOneWorkerForLinux() /var/www/diary/lib/Workerman/Worker.php:1373
108.0980 2981432 8. Workerman\Worker->run() /var/www/diary/lib/Workerman/Worker.php:1543
108.1004 3034448 9. Workerman\Events\Select->loop() /var/www/diary/lib/Workerman/Worker.php:2419
118.1001 3203544 10. Workerman\Connection\TcpConnection->baseRead() /var/www/diary/lib/Workerman/Events/Select.php:294
118.1001 3204184 11. Workerman\Protocols\Websocket::input() /var/www/diary/lib/Workerman/Connection/TcpConnection.php:600
118.1002 3204184 12. Workerman\Protocols\Websocket::dealHandshake() /var/www/diary/lib/Workerman/Protocols/Websocket.php:57
2021-07-14 15:38:31 pid:1011 worker[diaryWorkermanWebsocketServer:1569] exit with status 64000
[2021-07-14 15:38:31] Worker 0 started
[2021-07-14 15:38:41] new connection 172.17.0.2-8910-0-1 from ip 172.17.0.1
2021-07-14 15:38:41 pid:1570 Exception: 鏈接unique_id=172.17.0.2-8910-0-1,鏈接參數(shù)錯誤,sid為空 in /var/www/diary/server/WorkermanWebsocketServer.php:116
Stack trace:
#0 /var/www/diary/lib/Workerman/Protocols/Websocket.php(392): {closure}()
#1 /var/www/diary/lib/Workerman/Protocols/Websocket.php(57): Workerman\Protocols\Websocket::dealHandshake()
#2 /var/www/diary/lib/Workerman/Connection/TcpConnection.php(600): Workerman\Protocols\Websocket::input()
#3 /var/www/diary/lib/Workerman/Events/Select.php(294): Workerman\Connection\TcpConnection->baseRead()
#4 /var/www/diary/lib/Workerman/Worker.php(2419): Workerman\Events\Select->loop()
#5 /var/www/diary/lib/Workerman/Worker.php(1543): Workerman\Worker->run()
#6 /var/www/diary/lib/Workerman/Worker.php(1373): Workerman\Worker::forkOneWorkerForLinux()
#7 /var/www/diary/lib/Workerman/Worker.php(1347): Workerman\Worker::forkWorkersForLinux()
#8 /var/www/diary/lib/Workerman/Worker.php(1680): Workerman\Worker::forkWorkers()
#9 /var/www/diary/lib/Workerman/Worker.php(1629): Workerman\Worker::monitorWorkersForLinux()
#10 /var/www/diary/lib/Workerman/Worker.php(544): Workerman\Worker::monitorWorkers()
#11 /var/www/diary/server/WorkermanWebsocketServer.php(181): Workerman\Worker::runAll()
#12 {main}
2021-07-14 15:38:41 pid:1570 Worker[1570] process terminated
Warning: (null)(): supplied resource is not a valid stream resource in Unknown on line 0
Call Stack:
0.0004 1382960 1. {main}() /var/www/diary/server/WorkermanWebsocketServer.php:0
0.0172 2878392 2. Workerman\Worker::runAll() /var/www/diary/server/WorkermanWebsocketServer.php:181
0.0486 2980704 3. Workerman\Worker::monitorWorkers() /var/www/diary/lib/Workerman/Worker.php:544
0.0486 2980704 4. Workerman\Worker::monitorWorkersForLinux() /var/www/diary/lib/Workerman/Worker.php:1629
118.1110 2982184 5. Workerman\Worker::forkWorkers() /var/www/diary/lib/Workerman/Worker.php:1680
118.1110 2982184 6. Workerman\Worker::forkWorkersForLinux() /var/www/diary/lib/Workerman/Worker.php:1347
118.1110 2982184 7. Workerman\Worker::forkOneWorkerForLinux() /var/www/diary/lib/Workerman/Worker.php:1373
118.1130 2981432 8. Workerman\Worker->run() /var/www/diary/lib/Workerman/Worker.php:1543
118.1157 3034448 9. Workerman\Events\Select->loop() /var/www/diary/lib/Workerman/Worker.php:2419
128.1156 3203544 10. Workerman\Connection\TcpConnection->baseRead() /var/www/diary/lib/Workerman/Events/Select.php:294
128.1156 3204184 11. Workerman\Protocols\Websocket::input() /var/www/diary/lib/Workerman/Connection/TcpConnection.php:600
128.1156 3204184 12. Workerman\Protocols\Websocket::dealHandshake() /var/www/diary/lib/Workerman/Protocols/Websocket.php:57
Warning: (null)(): supplied resource is not a valid stream resource in Unknown on line 0
Call Stack:
0.0004 1382960 1. {main}() /var/www/diary/server/WorkermanWebsocketServer.php:0
0.0172 2878392 2. Workerman\Worker::runAll() /var/www/diary/server/WorkermanWebsocketServer.php:181
0.0486 2980704 3. Workerman\Worker::monitorWorkers() /var/www/diary/lib/Workerman/Worker.php:544
0.0486 2980704 4. Workerman\Worker::monitorWorkersForLinux() /var/www/diary/lib/Workerman/Worker.php:1629
118.1110 2982184 5. Workerman\Worker::forkWorkers() /var/www/diary/lib/Workerman/Worker.php:1680
118.1110 2982184 6. Workerman\Worker::forkWorkersForLinux() /var/www/diary/lib/Workerman/Worker.php:1347
118.1110 2982184 7. Workerman\Worker::forkOneWorkerForLinux() /var/www/diary/lib/Workerman/Worker.php:1373
118.1130 2981432 8. Workerman\Worker->run() /var/www/diary/lib/Workerman/Worker.php:1543
118.1157 3034448 9. Workerman\Events\Select->loop() /var/www/diary/lib/Workerman/Worker.php:2419
128.1156 3203544 10. Workerman\Connection\TcpConnection->baseRead() /var/www/diary/lib/Workerman/Events/Select.php:294
128.1156 3204184 11. Workerman\Protocols\Websocket::input() /var/www/diary/lib/Workerman/Connection/TcpConnection.php:600
128.1156 3204184 12. Workerman\Protocols\Websocket::dealHandshake() /var/www/diary/lib/Workerman/Protocols/Websocket.php:57
2021-07-14 15:38:41 pid:1011 worker[diaryWorkermanWebsocketServer:1570] exit with status 64000
[2021-07-14 15:38:41] Worker 0 started
[2021-07-14 15:38:51] new connection 172.17.0.2-8910-0-1 from ip 172.17.0.1
2021-07-14 15:38:51 pid:1571 Exception: 鏈接unique_id=172.17.0.2-8910-0-1,鏈接參數(shù)錯誤,sid為空 in /var/www/diary/server/WorkermanWebsocketServer.php:116
Stack trace:
#0 /var/www/diary/lib/Workerman/Protocols/Websocket.php(392): {closure}()
#1 /var/www/diary/lib/Workerman/Protocols/Websocket.php(57): Workerman\Protocols\Websocket::dealHandshake()
#2 /var/www/diary/lib/Workerman/Connection/TcpConnection.php(600): Workerman\Protocols\Websocket::input()
#3 /var/www/diary/lib/Workerman/Events/Select.php(294): Workerman\Connection\TcpConnection->baseRead()
#4 /var/www/diary/lib/Workerman/Worker.php(2419): Workerman\Events\Select->loop()
#5 /var/www/diary/lib/Workerman/Worker.php(1543): Workerman\Worker->run()
#6 /var/www/diary/lib/Workerman/Worker.php(1373): Workerman\Worker::forkOneWorkerForLinux()
#7 /var/www/diary/lib/Workerman/Worker.php(1347): Workerman\Worker::forkWorkersForLinux()
#8 /var/www/diary/lib/Workerman/Worker.php(1680): Workerman\Worker::forkWorkers()
#9 /var/www/diary/lib/Workerman/Worker.php(1629): Workerman\Worker::monitorWorkersForLinux()
#10 /var/www/diary/lib/Workerman/Worker.php(544): Workerman\Worker::monitorWorkers()
#11 /var/www/diary/server/WorkermanWebsocketServer.php(181): Workerman\Worker::runAll()
#12 {main}
2021-07-14 15:38:51 pid:1571 Worker[1571] process terminated
Warning: (null)(): supplied resource is not a valid stream resource in Unknown on line 0
Call Stack:
0.0004 1382960 1. {main}() /var/www/diary/server/WorkermanWebsocketServer.php:0
0.0172 2878392 2. Workerman\Worker::runAll() /var/www/diary/server/WorkermanWebsocketServer.php:181
0.0486 2980704 3. Workerman\Worker::monitorWorkers() /var/www/diary/lib/Workerman/Worker.php:544
0.0486 2980704 4. Workerman\Worker::monitorWorkersForLinux() /var/www/diary/lib/Workerman/Worker.php:1629
128.1293 2982184 5. Workerman\Worker::forkWorkers() /var/www/diary/lib/Workerman/Worker.php:1680
128.1293 2982184 6. Workerman\Worker::forkWorkersForLinux() /var/www/diary/lib/Workerman/Worker.php:1347
128.1294 2982184 7. Workerman\Worker::forkOneWorkerForLinux() /var/www/diary/lib/Workerman/Worker.php:1373
128.1310 2981432 8. Workerman\Worker->run() /var/www/diary/lib/Workerman/Worker.php:1543
128.1338 3034448 9. Workerman\Events\Select->loop() /var/www/diary/lib/Workerman/Worker.php:2419
138.1337 3203544 10. Workerman\Connection\TcpConnection->baseRead() /var/www/diary/lib/Workerman/Events/Select.php:294
138.1338 3204184 11. Workerman\Protocols\Websocket::input() /var/www/diary/lib/Workerman/Connection/TcpConnection.php:600
138.1338 3204184 12. Workerman\Protocols\Websocket::dealHandshake() /var/www/diary/lib/Workerman/Protocols/Websocket.php:57
Warning: (null)(): supplied resource is not a valid stream resource in Unknown on line 0
Call Stack:
0.0004 1382960 1. {main}() /var/www/diary/server/WorkermanWebsocketServer.php:0
0.0172 2878392 2. Workerman\Worker::runAll() /var/www/diary/server/WorkermanWebsocketServer.php:181
0.0486 2980704 3. Workerman\Worker::monitorWorkers() /var/www/diary/lib/Workerman/Worker.php:544
0.0486 2980704 4. Workerman\Worker::monitorWorkersForLinux() /var/www/diary/lib/Workerman/Worker.php:1629
128.1293 2982184 5. Workerman\Worker::forkWorkers() /var/www/diary/lib/Workerman/Worker.php:1680
128.1293 2982184 6. Workerman\Worker::forkWorkersForLinux() /var/www/diary/lib/Workerman/Worker.php:1347
128.1294 2982184 7. Workerman\Worker::forkOneWorkerForLinux() /var/www/diary/lib/Workerman/Worker.php:1373
128.1310 2981432 8. Workerman\Worker->run() /var/www/diary/lib/Workerman/Worker.php:1543
128.1338 3034448 9. Workerman\Events\Select->loop() /var/www/diary/lib/Workerman/Worker.php:2419
138.1337 3203544 10. Workerman\Connection\TcpConnection->baseRead() /var/www/diary/lib/Workerman/Events/Select.php:294
138.1338 3204184 11. Workerman\Protocols\Websocket::input() /var/www/diary/lib/Workerman/Connection/TcpConnection.php:600
138.1338 3204184 12. Workerman\Protocols\Websocket::dealHandshake() /var/www/diary/lib/Workerman/Protocols/Websocket.php:57
2021-07-14 15:38:51 pid:1011 worker[diaryWorkermanWebsocketServer:1571] exit with status 64000
[2021-07-14 15:38:51] Worker 0 started
我看代碼應該是這段出的問題:
try {
\call_user_func(isset($connection->onWebSocketConnect)?$connection->onWebSocketConnect:$connection->worker->onWebSocketConnect, $connection, $buffer);
} catch (\Exception $e) {
Worker::log($e);
exit(250);
} catch (\Error $e) {
Worker::log($e);
exit(250);
}
因為我代碼中拋出了異常導致的,但是我改成拋出我自定義的異常類
throw new NotDoException('鏈接unique_id=' . $connection->uniqueId . ',鏈接參數(shù)錯誤,sid為空', 1026);
還是會觸發(fā)這里的異常處理,請問一下這種情況該怎么處理呢?難道只能放棄我自己的拋出異常的想法嗎?
1、你query傳的是sidx,程序里判斷卻用的是sid,要細心?。?br /> 2、workerman正是因為健壯才在我們寫代碼不嚴謹或者遇到異常時拋出執(zhí)行堆棧等等措施方便我們排查問題;
@8083: 一句話: 就你這種場景的測報錯才正常; 題外話: 任何外來的數(shù)據(jù)從來都不要相信、不論你這個場景是不是測試、這個問題的定性在我看來它就是就是人為的BUG;至于workerman框架提供的或者PHP內(nèi)置的報錯機制那是必然要有的、目的就是為了方便開發(fā)者排錯;至于攻擊我覺得是另外一個層面的安全大問題了、沒有絕對的安全、只有相對一層層的安全措施加持、就好比你這段代碼扔生產(chǎn)環(huán)境之前是不是起碼也得經(jīng)過層層的檢驗呢、換句話: 我們接納有意義的報錯、但是我們必須盡可能在最后一道上線關口之前將報錯消滅到最小危害程度。
正常情況發(fā)生notice錯誤,workerman不會拋出這個異常,進程不會退出重啟。
你的程序不斷退出,是因為你業(yè)務捕獲了notice錯誤并拋出異常,但是你業(yè)務又沒去捕獲這個異常,導致異常傳遞到workerman框架,workerman能做的也只能是記錄異常重啟當前進程。workerman這么做是沒問題的。如果不這樣做,那么你可能都無法發(fā)現(xiàn)這個異常,以為程序正常,實際上是有問題的。
如果你不想進程因為notice重啟,你就不要捕獲notice后拋出異常,或者拋出異常后你自己捕獲下。最根本的方法就是測試好程序,不要有bug。