mm_os 3.3.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/LICENSE +21 -201
  2. package/README.md +491 -99
  3. package/README_EN.md +498 -0
  4. package/adapter/adapter.js +431 -0
  5. package/adapter/custom_persistence.js +660 -0
  6. package/adapter/mqtt.js +273 -0
  7. package/adapter/socket.js +113 -0
  8. package/adapter/web.js +67 -0
  9. package/adapter/websocket.js +146 -0
  10. package/com/api/com.json +5 -0
  11. package/{core/com → com}/api/config.tpl.json +8 -8
  12. package/com/api/drive.js +708 -0
  13. package/com/api/index.js +198 -0
  14. package/com/api/oauth.js +200 -0
  15. package/com/api/script.tpl.js +32 -0
  16. package/com/cmd/README.md +11 -0
  17. package/com/cmd/com.json +5 -0
  18. package/com/cmd/config.tpl.json +122 -0
  19. package/com/cmd/drive.js +1548 -0
  20. package/com/cmd/index.js +1066 -0
  21. package/com/cmd/msg.json +48 -0
  22. package/com/cmd/nlp.js +525 -0
  23. package/com/cmd/script.tpl.js +32 -0
  24. package/com/db/com.json +5 -0
  25. package/com/db/drive.js +1999 -0
  26. package/com/db/index.js +242 -0
  27. package/{core/com → com}/event/README.md +4 -4
  28. package/com/event/com.json +5 -0
  29. package/{core/com → com}/event/config.tpl.json +18 -18
  30. package/com/event/drive.js +59 -0
  31. package/com/event/index.js +409 -0
  32. package/com/event/script.tpl.js +23 -0
  33. package/com/mqtt/com.json +5 -0
  34. package/{core/com → com}/mqtt/config.tpl.json +3 -5
  35. package/com/mqtt/drive.js +676 -0
  36. package/com/mqtt/index.js +822 -0
  37. package/com/mqtt/mm_mqtt.js +425 -0
  38. package/com/mqtt/script.tpl.js +723 -0
  39. package/com/nav/com.json +5 -0
  40. package/com/nav/config.tpl.json +84 -0
  41. package/com/nav/drive.js +702 -0
  42. package/com/nav/index.js +231 -0
  43. package/{core/com → com}/nav/tpl/admin_pc/page_config.vue +280 -280
  44. package/{core/com → com}/nav/tpl/admin_pc/page_config_form.vue +194 -194
  45. package/com/nav/tpl/admin_pc/page_form.vue +180 -0
  46. package/com/nav/tpl/admin_pc/page_view.vue +124 -0
  47. package/com/nav/tpl/dev_pc/page_default.vue +247 -0
  48. package/com/nav/tpl/dev_pc/page_type.vue +313 -0
  49. package/com/nav/tpl/home_pc/page_default.vue +234 -0
  50. package/com/nav/tpl/home_pc/page_form.vue +137 -0
  51. package/com/nav/tpl/home_pc/page_list.vue +234 -0
  52. package/com/nav/tpl/home_pc/page_nav.vue +221 -0
  53. package/com/nav/tpl/home_pc/page_type.vue +234 -0
  54. package/com/nav/tpl/home_pc/page_view.vue +125 -0
  55. package/com/nav/tpl/home_phone/page_channel.vue +234 -0
  56. package/com/nav/tpl/home_phone/page_default.vue +234 -0
  57. package/com/nav/tpl/home_phone/page_form.vue +137 -0
  58. package/com/nav/tpl/home_phone/page_nav.vue +237 -0
  59. package/com/nav/tpl/home_phone/page_type.vue +234 -0
  60. package/com/nav/tpl/home_phone/page_view.vue +125 -0
  61. package/com/nav/viewmodel.js +446 -0
  62. package/com/param/com.json +5 -0
  63. package/{core/com → com}/param/config.tpl.json +7 -1
  64. package/com/param/drive.js +502 -0
  65. package/com/param/index.js +155 -0
  66. package/com/param/script.tpl.js +12 -0
  67. package/com/pendant/com.json +5 -0
  68. package/{core/com/component → com/pendant}/config.tpl.json +15 -13
  69. package/com/pendant/drive.js +204 -0
  70. package/com/pendant/index.js +441 -0
  71. package/com/pendant/pendant.html +16 -0
  72. package/com/pendant/script.tpl.js +18 -0
  73. package/com/socket/com.json +5 -0
  74. package/com/socket/config.tpl.json +12 -0
  75. package/com/socket/drive.js +651 -0
  76. package/com/socket/index.js +351 -0
  77. package/com/socket/script.tpl.js +41 -0
  78. package/com/sql/com.json +5 -0
  79. package/{core/com → com}/sql/config.tpl.json +13 -9
  80. package/com/sql/drive.js +1259 -0
  81. package/com/sql/index.js +150 -0
  82. package/com/sql/script.tpl.js +47 -0
  83. package/com/static/com.json +5 -0
  84. package/{core/com → com}/static/config.tpl.json +10 -6
  85. package/com/static/drive.js +194 -0
  86. package/com/static/index.js +226 -0
  87. package/com/static/script.tpl.js +28 -0
  88. package/com/task/com.json +5 -0
  89. package/{core/com → com}/task/config.tpl.json +4 -6
  90. package/com/task/drive.js +405 -0
  91. package/com/task/index.js +148 -0
  92. package/com/task/script.tpl.js +37 -0
  93. package/com/template/com.json +5 -0
  94. package/com/template/config.tpl.json +16 -0
  95. package/com/template/drive.js +80 -0
  96. package/com/template/index.js +141 -0
  97. package/com.js +156 -0
  98. package/common/README.md +2 -0
  99. package/common/handler/msg/handler.json +22 -0
  100. package/common/handler/msg/index.js +23 -0
  101. package/common/handler/player/handler.json +22 -0
  102. package/common/handler/player/index.js +287 -0
  103. package/common/handler/user/handler.json +22 -0
  104. package/common/handler/user/index.js +23 -0
  105. package/common/middleware/web_after/index.js +29 -0
  106. package/common/middleware/web_after/middleware.json +9 -0
  107. package/common/middleware/web_base/index.js +113 -0
  108. package/common/middleware/web_base/middleware.json +19 -0
  109. package/common/middleware/web_before/index.js +33 -0
  110. package/common/middleware/web_before/middleware.json +9 -0
  111. package/common/middleware/web_cors/index.js +87 -0
  112. package/common/middleware/web_cors/middleware.json +24 -0
  113. package/common/middleware/web_error/index.js +119 -0
  114. package/common/middleware/web_error/middleware.json +18 -0
  115. package/common/middleware/web_ip/index.js +15 -0
  116. package/common/middleware/web_ip/middleware.json +14 -0
  117. package/common/middleware/web_logger/index.js +156 -0
  118. package/common/middleware/web_logger/middleware.json +14 -0
  119. package/common/middleware/web_main/index.js +24 -0
  120. package/common/middleware/web_main/middleware.json +9 -0
  121. package/common/middleware/web_static/index.js +73 -0
  122. package/common/middleware/web_static/middleware.json +54 -0
  123. package/common/middleware/web_waf/index.js +385 -0
  124. package/common/middleware/web_waf/middleware.json +13 -0
  125. package/common/model/msg/index.js +88 -0
  126. package/common/model/msg/model.json +401 -0
  127. package/common/model/player/index.js +63 -0
  128. package/common/model/player/model.json +185 -0
  129. package/common/model/user/index.js +11 -0
  130. package/common/model/user/model.json +219 -0
  131. package/core/app/config.tpl.json +67 -0
  132. package/core/app/index.js +632 -0
  133. package/core/app/script.tpl.js +52 -0
  134. package/core/channel/index.js +899 -0
  135. package/core/channel/matcher.js +585 -0
  136. package/core/com/config.tpl.json +16 -0
  137. package/core/com/index.js +74 -0
  138. package/core/com/script.tpl.js +5 -0
  139. package/core/component/component.js +42 -0
  140. package/core/component/config.tpl.json +63 -0
  141. package/core/component/index.js +273 -0
  142. package/core/component/script.tpl.js +19 -0
  143. package/core/controller/config.tpl.json +14 -0
  144. package/core/controller/index.js +373 -0
  145. package/core/controller/script.tpl.js +27 -0
  146. package/core/factory/config.tpl.json +14 -0
  147. package/core/factory/entity.js +275 -0
  148. package/core/factory/index.js +241 -0
  149. package/core/factory/script.tpl.js +16 -0
  150. package/core/game/bat/index.js +137 -0
  151. package/core/game/bat/world.js +622 -0
  152. package/core/game/config.tpl.json +16 -0
  153. package/core/game/entity_admin.js +230 -0
  154. package/core/game/index.js +186 -0
  155. package/core/handler/config.tpl.json +22 -0
  156. package/core/handler/index.js +181 -0
  157. package/core/handler/script.tpl.js +23 -0
  158. package/core/logic/config.tpl.json +14 -0
  159. package/core/logic/index.js +59 -0
  160. package/core/logic/script.tpl.js +19 -0
  161. package/core/middleware/config.tpl.json +16 -0
  162. package/core/middleware/index.js +125 -0
  163. package/core/middleware/script.tpl.js +37 -0
  164. package/core/mod/config.tpl.json +22 -0
  165. package/core/mod/index.js +130 -0
  166. package/core/mod/script.tpl.js +34 -0
  167. package/core/model/config.tpl.json +219 -0
  168. package/core/model/index.js +272 -0
  169. package/core/model/model.js +27 -0
  170. package/core/model/script.tpl.js +20 -0
  171. package/core/notifier/config.tpl.json +14 -0
  172. package/core/notifier/index.js +77 -0
  173. package/core/notifier/script.tpl.js +20 -0
  174. package/core/plugin/config.tpl.json +24 -0
  175. package/core/plugin/index.js +232 -0
  176. package/core/plugin/script.tpl.js +51 -0
  177. package/core/pusher/config.tpl.json +14 -0
  178. package/core/pusher/index.js +161 -0
  179. package/core/pusher/script.tpl.js +20 -0
  180. package/core/room/bat/index.js +170 -0
  181. package/core/room/bat/room.js +524 -0
  182. package/core/room/config.tpl.json +20 -0
  183. package/core/room/index.js +249 -0
  184. package/core/room/room.js +61 -0
  185. package/core/scene/config.tpl.json +14 -0
  186. package/core/scene/index.js +466 -0
  187. package/core/scene/loop.js +1255 -0
  188. package/core/scene/map.js +28 -0
  189. package/core/scene/script.tpl.js +22 -0
  190. package/core/sender/config.tpl.json +14 -0
  191. package/core/sender/index.js +79 -0
  192. package/core/sender/script.tpl.js +20 -0
  193. package/core/service/config.tpl.json +14 -0
  194. package/core/service/index.js +100 -0
  195. package/core/service/script.tpl.js +25 -0
  196. package/core/store/config.tpl.json +26 -0
  197. package/core/store/index.js +1755 -0
  198. package/core/store/script.tpl.js +22 -0
  199. package/core/store/sql.js +1464 -0
  200. package/core/system/config.tpl.json +18 -0
  201. package/core/system/index.js +312 -0
  202. package/core/system/script.tpl.js +77 -0
  203. package/core/view/config.tpl.json +14 -0
  204. package/core/view/index.js +91 -0
  205. package/core/view/script.tpl.js +20 -0
  206. package/core/zone/bat/index.js +725 -0
  207. package/core/zone/config.tpl.json +54 -0
  208. package/core/zone/index.js +614 -0
  209. package/core/zone/script.tpl.js +10 -0
  210. package/core/zone/zone_bat.js +136 -0
  211. package/core//345/237/272/347/261/273/346/250/241/345/235/227/346/270/205/345/215/225.md +24 -0
  212. package/index.js +17 -333
  213. package/os.js +57 -0
  214. package/package.json +58 -58
  215. package/server.js +598 -0
  216. package/README.en.md +0 -36
  217. package/conf.json +0 -3
  218. package/core/base/mqtt/index.js +0 -1110
  219. package/core/base/mqtt/lib.js +0 -40
  220. package/core/base/web/index.js +0 -245
  221. package/core/com/api/com.json +0 -4
  222. package/core/com/api/drive.js +0 -668
  223. package/core/com/api/index.js +0 -108
  224. package/core/com/api/oauth.js +0 -158
  225. package/core/com/api/script.js +0 -32
  226. package/core/com/app/README.md +0 -3
  227. package/core/com/app/com.json +0 -4
  228. package/core/com/app/config.tpl.json +0 -16
  229. package/core/com/app/drive.js +0 -309
  230. package/core/com/app/index.js +0 -211
  231. package/core/com/app/script.js +0 -155
  232. package/core/com/cmd/com.json +0 -4
  233. package/core/com/cmd/config.tpl.json +0 -66
  234. package/core/com/cmd/drive.js +0 -513
  235. package/core/com/cmd/index.js +0 -354
  236. package/core/com/cmd/old/5w2h.js +0 -54
  237. package/core/com/cmd/old/drive.js +0 -423
  238. package/core/com/cmd/script.js +0 -11
  239. package/core/com/component/README.md +0 -3
  240. package/core/com/component/com.json +0 -4
  241. package/core/com/component/component.html +0 -16
  242. package/core/com/component/drive.js +0 -197
  243. package/core/com/component/index.js +0 -312
  244. package/core/com/component/script.js +0 -18
  245. package/core/com/db/com.json +0 -4
  246. package/core/com/db/drive.js +0 -1160
  247. package/core/com/db/index.js +0 -176
  248. package/core/com/event/com.json +0 -4
  249. package/core/com/event/drive.js +0 -133
  250. package/core/com/event/index.js +0 -345
  251. package/core/com/event/script.js +0 -26
  252. package/core/com/eventer/com.js +0 -477
  253. package/core/com/eventer/com.json +0 -4
  254. package/core/com/middleware/com.js +0 -154
  255. package/core/com/middleware/com.json +0 -4
  256. package/core/com/middleware/config.tpl.json +0 -8
  257. package/core/com/middleware/script.js +0 -9
  258. package/core/com/mqtt/com.json +0 -4
  259. package/core/com/mqtt/drive.js +0 -600
  260. package/core/com/mqtt/index.js +0 -572
  261. package/core/com/mqtt/mm_mqtt.js +0 -330
  262. package/core/com/mqtt/script.js +0 -604
  263. package/core/com/msg/com.js +0 -296
  264. package/core/com/msg/com.json +0 -4
  265. package/core/com/nav/com.json +0 -4
  266. package/core/com/nav/config.tpl.json +0 -75
  267. package/core/com/nav/drive.js +0 -549
  268. package/core/com/nav/index.js +0 -182
  269. package/core/com/nav/tpl/admin_pc/page_form.vue +0 -180
  270. package/core/com/nav/tpl/admin_pc/page_view.vue +0 -124
  271. package/core/com/nav/tpl/dev_pc/page_default.vue +0 -247
  272. package/core/com/nav/tpl/dev_pc/page_type.vue +0 -313
  273. package/core/com/nav/tpl/home_pc/page_default.vue +0 -234
  274. package/core/com/nav/tpl/home_pc/page_form.vue +0 -137
  275. package/core/com/nav/tpl/home_pc/page_list.vue +0 -234
  276. package/core/com/nav/tpl/home_pc/page_nav.vue +0 -221
  277. package/core/com/nav/tpl/home_pc/page_type.vue +0 -234
  278. package/core/com/nav/tpl/home_pc/page_view.vue +0 -125
  279. package/core/com/nav/tpl/home_phone/page_channel.vue +0 -234
  280. package/core/com/nav/tpl/home_phone/page_default.vue +0 -234
  281. package/core/com/nav/tpl/home_phone/page_form.vue +0 -137
  282. package/core/com/nav/tpl/home_phone/page_nav.vue +0 -237
  283. package/core/com/nav/tpl/home_phone/page_type.vue +0 -234
  284. package/core/com/nav/tpl/home_phone/page_view.vue +0 -125
  285. package/core/com/nav/viewmodel.js +0 -296
  286. package/core/com/param/drive.js +0 -366
  287. package/core/com/param/index.js +0 -80
  288. package/core/com/param/script.js +0 -12
  289. package/core/com/param/test.js +0 -98
  290. package/core/com/plugin/README.md +0 -3
  291. package/core/com/plugin/com.json +0 -4
  292. package/core/com/plugin/config.tpl.json +0 -26
  293. package/core/com/plugin/drive.js +0 -536
  294. package/core/com/plugin/index.js +0 -259
  295. package/core/com/plugin/script.js +0 -213
  296. package/core/com/rpc/com.json +0 -4
  297. package/core/com/rpc/drive.js +0 -160
  298. package/core/com/rpc/index.js +0 -87
  299. package/core/com/rpc/rpc.js +0 -118
  300. package/core/com/socket/com.json +0 -4
  301. package/core/com/socket/config.tpl.json +0 -14
  302. package/core/com/socket/drive.js +0 -403
  303. package/core/com/socket/index.js +0 -62
  304. package/core/com/socket/script.js +0 -42
  305. package/core/com/sql/drive.js +0 -1087
  306. package/core/com/sql/index.js +0 -83
  307. package/core/com/sql/script.js +0 -48
  308. package/core/com/static/com.json +0 -4
  309. package/core/com/static/drive.js +0 -220
  310. package/core/com/static/index.js +0 -149
  311. package/core/com/static/script.js +0 -28
  312. package/core/com/task/com.json +0 -4
  313. package/core/com/task/drive.js +0 -403
  314. package/core/com/task/index.js +0 -110
  315. package/core/com/task/script.js +0 -37
  316. package/core/com/timer/com.js +0 -217
  317. package/core/com/timer/com.json +0 -4
  318. package/core/com/tpl/com.js +0 -19
  319. package/core/com/tpl/com.json +0 -4
  320. package/lib/actions.js +0 -50
  321. package/lib/base.js +0 -361
  322. package/lib/com.js +0 -29
  323. package/lib/ref.js +0 -121
  324. package/middleware/cors/index.js +0 -119
  325. package/middleware/cors/middleware.json +0 -20
  326. package/middleware/csrf/index.js +0 -202
  327. package/middleware/csrf/middleware.json +0 -24
  328. package/middleware/ip_firewall/index.js +0 -476
  329. package/middleware/ip_firewall/middleware.json +0 -109
  330. package/middleware/mqtt_base/index.js +0 -10
  331. package/middleware/mqtt_base/middleware.json +0 -11
  332. package/middleware/security_audit/index.js +0 -543
  333. package/middleware/security_audit/middleware.json +0 -48
  334. package/middleware/waf/index.js +0 -343
  335. package/middleware/waf/middleware.json +0 -10
  336. package/middleware/waf_ddos/index.js +0 -520
  337. package/middleware/waf_ddos/middleware.json +0 -38
  338. package/middleware/waf_xss/index.js +0 -269
  339. package/middleware/waf_xss/middleware.json +0 -18
  340. package/middleware/web_after/index.js +0 -33
  341. package/middleware/web_after/middleware.json +0 -10
  342. package/middleware/web_base/index.js +0 -90
  343. package/middleware/web_base/middleware.json +0 -10
  344. package/middleware/web_before/index.js +0 -27
  345. package/middleware/web_before/middleware.json +0 -10
  346. package/middleware/web_check/index.js +0 -28
  347. package/middleware/web_check/middleware.json +0 -10
  348. package/middleware/web_main/index.js +0 -28
  349. package/middleware/web_main/middleware.json +0 -10
  350. package/middleware/web_proxy/index.js +0 -37
  351. package/middleware/web_proxy/middleware.json +0 -10
  352. package/middleware/web_render/index.js +0 -87
  353. package/middleware/web_render/middleware.json +0 -10
  354. package/middleware/web_socket/index.js +0 -34
  355. package/middleware/web_socket/middleware.json +0 -10
  356. package/middleware/web_static/index.js +0 -115
  357. package/middleware/web_static/middleware.json +0 -10
  358. /package/{core/com → com}/api/README.md +0 -0
  359. /package/{core/com → com}/db/README.md +0 -0
  360. /package/{core/com → com}/mqtt/README.md +0 -0
  361. /package/{core/com → com}/nav/README.md +0 -0
  362. /package/{core/com → com}/nav/tpl/admin_pc/page_channel.vue +0 -0
  363. /package/{core/com → com}/nav/tpl/admin_pc/page_default.vue +0 -0
  364. /package/{core/com → com}/nav/tpl/admin_pc/page_lang.vue +0 -0
  365. /package/{core/com → com}/nav/tpl/admin_pc/page_nav.vue +0 -0
  366. /package/{core/com → com}/nav/tpl/admin_pc/page_table.vue +0 -0
  367. /package/{core/com → com}/nav/tpl/admin_pc/page_type.vue +0 -0
  368. /package/{core/com → com}/nav/tpl/dev_pc/page_channel.vue +0 -0
  369. /package/{core/com → com}/nav/tpl/dev_pc/page_config.vue +0 -0
  370. /package/{core/com → com}/nav/tpl/dev_pc/page_form.vue +0 -0
  371. /package/{core/com → com}/nav/tpl/dev_pc/page_nav.vue +0 -0
  372. /package/{core/com → com}/nav/tpl/dev_pc/page_table.vue +0 -0
  373. /package/{core/com → com}/nav/tpl/home_pc/page_channel.vue +0 -0
  374. /package/{core/com → com}/nav/tpl/home_phone/page_list.vue +0 -0
  375. /package/{core/com → com}/param/README.md +0 -0
  376. /package/{core/com/cmd → com/pendant}/README.md +0 -0
  377. /package/{core/com → com}/socket/README.md +0 -0
  378. /package/{core/com → com}/sql/README.md +0 -0
  379. /package/{core/com → com}/static/README.md +0 -0
  380. /package/{core/com → com}/task/README.md +0 -0
@@ -1,343 +0,0 @@
1
- /**
2
- * 使用正则表达式,检测字符串是否含有攻击特征,检测到攻击特征返回true,没检测到返回false
3
- * @param {String} url 网址
4
- */
5
- function waf_check(url) {
6
- // 基本防御
7
- var rule = [
8
- /select.+(from|limit)/i,
9
- /(?:(union(.*?)select))/i,
10
- /sleep\((\s*)(\d*)(\s*)\)/i,
11
- /group\s+by.+\(/i,
12
- /(?:from\W+information_schema\W)/i,
13
- /(?:(?:current_)user|database|schema|connection_id)\s*\(/i,
14
- /\s*or\s+.*=.*/i,
15
- /order\s+by\s+.*--$/i,
16
- /benchmark\((.*)\,(.*)\)/i,
17
- /base64_decode\(/i,
18
- /(?:(?:current_)user|database|version|schema|connection_id)\s*\(/i,
19
- /(?:etc\/\W*passwd)/i,
20
- /into(\s+)+(?:dump|out)file\s*/i,
21
- /xwork.MethodAccessor/i,
22
- /(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\(/i,
23
- /\<(iframe|script|body|img|layer|div|meta|style|base|object|input)/i,
24
- /(onmouseover|onmousemove|onerror|onload)\=/i,
25
- /javascript:/i,
26
- // 增强的路径遍历检测规则
27
- /\.\.\//i, // 基础 ../
28
- /\.\.\\/i, // Windows格式 ..\
29
- /\%2e\%2e\//i, // URL编码 ../
30
- /\%2e%2e\//i, // URL编码 ../
31
- /\%252e%252e%2f/i, // 双重URL编码 ../
32
- /\%252e\%252e\%2f/i, // 双重URL编码 ../
33
- /\.\%2e\//i, // 混合编码
34
- /\%2e\./i, // 变体形式
35
- /\%5c/i, // 反斜杠URL编码
36
- /\%255c/i, // 反斜杠双重URL编码
37
- // 系统文件路径检测
38
- /(?:\/etc|\/proc|\/sys|\/dev|C:\\Windows|C:\\winnt|C:\\Program Files)/i,
39
- // 命令注入检测
40
- /\|\|.*(?:ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv)/i,
41
- /(?:ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv).*\|\|/i,
42
- /(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\:\//i
43
- ];
44
- for (var i = 0; i < rule.length; i++) {
45
- if (rule[i].test(url) == true) {
46
- return rule[i];
47
- }
48
- }
49
- return null;
50
- }
51
-
52
- /**
53
- * 检查路径是否包含路径遍历攻击
54
- * @param {String} path 路径
55
- * @returns {Boolean} 是否包含路径遍历
56
- */
57
- function checkPathTraversal(path) {
58
- // 规范化路径以处理各种编码
59
- let normalizedPath = path;
60
-
61
- // 处理URL编码变体
62
- const urlDecoded = decodeURIComponent(path);
63
- const doubleUrlDecoded = decodeURIComponent(urlDecoded);
64
-
65
- // 检查路径是否包含危险模式
66
- const dangerousPatterns = [
67
- '../', '../../', '../../../', // Unix/Linux格式
68
- '..\\', '..\\\\', '..\\\\\\', // Windows格式
69
- '/%2e%2e/', '/%2e%2e%2f', // URL编码变体
70
- '\\%2e%2e\\', '\\%2e%2e\\\\' // Windows URL编码变体
71
- ];
72
-
73
- // 检查系统关键文件路径(绝对路径攻击)
74
- const systemPaths = [
75
- '/etc/passwd', '/etc/shadow', '/etc/group', '/etc/hosts',
76
- '/proc/', '/sys/', '/dev/', '/bin/', '/usr/bin/',
77
- 'C:\\Windows\\', 'C:\\winnt\\', 'C:\\Program Files\\'
78
- ];
79
-
80
- // 检查原始路径、单次解码和双重解码后的路径
81
- // 1. 检查相对路径遍历模式
82
- const hasTraversalPattern = dangerousPatterns.some(pattern =>
83
- path.includes(pattern) ||
84
- urlDecoded.includes(pattern) ||
85
- doubleUrlDecoded.includes(pattern)
86
- );
87
-
88
- // 2. 检查绝对路径攻击(包含系统关键文件路径)
89
- const hasAbsoluteAttack = systemPaths.some(systemPath =>
90
- path.toLowerCase().includes(systemPath.toLowerCase()) ||
91
- urlDecoded.toLowerCase().includes(systemPath.toLowerCase()) ||
92
- doubleUrlDecoded.toLowerCase().includes(systemPath.toLowerCase())
93
- );
94
-
95
- // 3. 检查是否以/开头的绝对路径(排除正常的网站路径)
96
- const startsWithSlash = path.startsWith('/') &&
97
- !path.startsWith('/api') &&
98
- !path.startsWith('/static') &&
99
- !path.startsWith('/public') &&
100
- !path.startsWith('/assets') &&
101
- !path.startsWith('/favicon.ico') &&
102
- !path.startsWith('/robots.txt');
103
-
104
- // 4. 检查是否包含敏感的系统文件扩展名
105
- const hasSensitiveExtension = /\.(conf|ini|log|env|git|svn|htpasswd|htaccess|bashrc|bash_history|ssh|key|pem|cer|crt|pfx|p12)$/i.test(path) ||
106
- /\.(conf|ini|log|env|git|svn|htpasswd|htaccess|bashrc|bash_history|ssh|key|pem|cer|crt|pfx|p12)$/i.test(urlDecoded) ||
107
- /\.(conf|ini|log|env|git|svn|htpasswd|htaccess|bashrc|bash_history|ssh|key|pem|cer|crt|pfx|p12)$/i.test(doubleUrlDecoded);
108
-
109
- return hasTraversalPattern || hasAbsoluteAttack || startsWithSlash || hasSensitiveExtension;
110
- }
111
-
112
- /**
113
- * 检查请求路径是否规范化,防止路径遍历攻击
114
- * @param {String} path 请求路径
115
- * @returns {Boolean} 是否为安全路径
116
- */
117
- function isSafePath(path) {
118
- // 特殊处理根路径,直接返回安全
119
- if (path === '/') {
120
- return true;
121
- }
122
-
123
- // 获取规范化的路径
124
- const normalizedPath = path.split('/')
125
- .filter(segment => segment !== '')
126
- .reduce((acc, segment) => {
127
- // 防止路径回溯
128
- if (segment === '..') {
129
- acc.pop();
130
- } else if (segment !== '.') {
131
- acc.push(segment);
132
- }
133
- return acc;
134
- }, [])
135
- .join('/');
136
-
137
- // 重新构建规范化的完整路径
138
- const safePath = '/' + normalizedPath;
139
-
140
- // 检查规范化后的路径长度是否小于原始路径(表示存在路径回溯)
141
- return safePath.length >= path.length - 2; // 允许末尾的 '/' 差异
142
- }
143
-
144
- function getClientIP(req) {
145
- return req.headers['x-forwarded-for'] || req.headers['X-Forwarded-For'] ||
146
- req.connection.remoteAddress ||
147
- req.socket.remoteAddress ||
148
- req.connection.socket.remoteAddress;
149
- };
150
-
151
- /**
152
- * 检查IP是否在白名单中
153
- * @param {String} ip IP地址
154
- * @param {Object} config WAF配置
155
- * @returns {Boolean} 是否在白名单中
156
- */
157
- function isInWhitelist(ip, config) {
158
- // 优先使用全局IP管理器
159
- try {
160
- var { is_ip_in_whitelist } = require('../../tools/ip_manager/ip.manager.global.js');
161
- if (is_ip_in_whitelist(ip)) {
162
- return true;
163
- }
164
- } catch (error) {
165
- // 如果全局IP管理器不可用,使用本地配置
166
- $.log.warn('全局IP管理器不可用,使用本地WAF白名单配置');
167
- }
168
-
169
- // 使用本地配置作为备用
170
- const whitelist = config && config.ip_whitelist && Array.isArray(config.ip_whitelist)
171
- ? config.ip_whitelist
172
- : ['127.0.0.1', '::1', 'localhost'];
173
-
174
- return whitelist.includes(ip);
175
- }
176
-
177
- /**
178
- * 检查路径是否在白名单中
179
- * @param {String} path 请求路径
180
- * @param {Object} config WAF配置
181
- * @returns {Boolean} 是否在白名单中
182
- */
183
- function isPathWhitelisted(path, config) {
184
- // 获取配置中的路径白名单,如果不存在则使用默认路径白名单
185
- const pathWhitelist = config && config.path_whitelist && Array.isArray(config.path_whitelist)
186
- ? config.path_whitelist
187
- : ['/static', '/favicon.ico', '/api', '/public', '/assets'];
188
-
189
- // 检查路径是否以白名单中的任何路径开头
190
- return pathWhitelist.some(whitelistPath => path.startsWith(whitelistPath));
191
- }
192
-
193
- /**
194
- * web防火墙
195
- * @param {Object} server 服务
196
- * @param {Object} config 配置参数
197
- */
198
- module.exports = function(server, config) {
199
- // 设置默认配置
200
- const defaultConfig = {
201
- log: true,
202
- ip_whitelist: ['127.0.0.1', '::1', 'localhost'],
203
- path_whitelist: ['/static', '/favicon.ico', '/api', '/public', '/assets']
204
- };
205
-
206
- // WAF中间件已初始化
207
-
208
- // 获取全局配置中的middleware.waf配置
209
- let wafConfig = defaultConfig;
210
- try {
211
- // 尝试从全局配置中获取middleware.waf配置
212
- const fs = require('fs');
213
- const path = require('path');
214
- const configPath = path.resolve(process.cwd(), 'config.json');
215
- if (fs.existsSync(configPath)) {
216
- const globalConfig = JSON.parse(fs.readFileSync(configPath, 'utf8'));
217
- if (globalConfig.middleware && globalConfig.middleware.waf) {
218
- // 安全地合并默认配置和全局配置
219
- wafConfig = Object.assign({}, defaultConfig, globalConfig.middleware.waf);
220
- // WAF使用config.json中的全局配置
221
- } else {
222
- // WAF使用默认配置(config.json中无middleware.waf配置)
223
- }
224
- }
225
- } catch (error) {
226
- // 全局WAF配置加载错误已通过日志系统记录
227
- // 出错时使用默认配置
228
- wafConfig = defaultConfig;
229
- }
230
-
231
- // 确保白名单数组存在且为数组类型
232
- if (!Array.isArray(wafConfig.ip_whitelist)) {
233
- wafConfig.ip_whitelist = defaultConfig.ip_whitelist;
234
- }
235
- if (!Array.isArray(wafConfig.path_whitelist)) {
236
- wafConfig.path_whitelist = defaultConfig.path_whitelist;
237
- }
238
-
239
- // 合并传入的config和全局配置
240
- const mergedConfig = { ...wafConfig, ...(config || {}) };
241
- // 合并后的WAF配置已生效
242
-
243
- /* WAF(web防火墙) */
244
- server.use(async (ctx, next) => {
245
- try {
246
- // 获取客户端IP
247
- var ip = getClientIP(ctx.req);
248
- // 规范化IP格式,移除IPv6前缀
249
- if (ip && ip.startsWith('::ffff:')) {
250
- ip = ip.substring(7);
251
- }
252
-
253
- // 获取请求路径
254
- const path = ctx.path;
255
-
256
- // WAF正在处理请求
257
-
258
- // 检查IP是否在白名单中,如果是则跳过所有检查
259
- if (isInWhitelist(ip, mergedConfig)) {
260
- // IP在白名单中,跳过安全检查
261
- await next();
262
- return;
263
- }
264
-
265
- // 检查路径是否在白名单中
266
- if (isPathWhitelisted(path, mergedConfig)) {
267
- // 路径在白名单中,跳过安全检查
268
- await next();
269
- return;
270
- }
271
-
272
- // 获取请求路径和完整URL
273
- var url = ctx.url;
274
-
275
- // 1. 使用正则表达式检查基本攻击特征
276
- var danger = waf_check(url);
277
- if (danger) {
278
- // 检测到攻击请求,已阻止
279
- ctx.status = 403;
280
- ctx.body = {
281
- code: 403,
282
- msg: '访问被WAF阻止,请求包含潜在的攻击特征',
283
- rule: danger.toString()
284
- };
285
- return;
286
- }
287
-
288
- // 2. 专门检查路径遍历攻击
289
- const hasTraversal = checkPathTraversal(path);
290
- const isSafe = isSafePath(path);
291
-
292
- if (hasTraversal || !isSafe) {
293
- // 检测到路径遍历攻击,已阻止
294
- ctx.status = 403;
295
- ctx.body = {
296
- code: 403,
297
- msg: '访问被WAF阻止,检测到路径遍历攻击尝试'
298
- };
299
- return;
300
- }
301
-
302
- // 3. 检查请求参数中的路径遍历
303
- const queryParams = ctx.query;
304
- for (const [key, value] of Object.entries(queryParams)) {
305
- if (typeof value === 'string') {
306
- const paramHasTraversal = checkPathTraversal(value);
307
- if (paramHasTraversal) {
308
- // 检测到请求参数中的路径遍历攻击,已阻止
309
- ctx.status = 403;
310
- ctx.body = {
311
- code: 403,
312
- msg: '访问被WAF阻止,请求参数中包含路径遍历攻击尝试'
313
- };
314
- return;
315
- }
316
- }
317
- }
318
-
319
- // 4. 如果是POST请求,检查请求体
320
- if (ctx.method === 'POST' && ctx.request.body) {
321
- const bodyContent = JSON.stringify(ctx.request.body);
322
- const bodyHasTraversal = checkPathTraversal(bodyContent);
323
- if (bodyHasTraversal) {
324
- // 检测到请求体中的路径遍历攻击,已阻止
325
- ctx.status = 403;
326
- ctx.body = {
327
- code: 403,
328
- msg: '访问被WAF阻止,请求体中包含路径遍历攻击尝试'
329
- };
330
- return;
331
- }
332
- }
333
-
334
- // 所有检查通过,继续处理请求
335
- await next();
336
- } catch (error) {
337
- // WAF中间件错误已通过日志系统记录
338
- // 出错时默认允许请求继续处理
339
- await next();
340
- }
341
- });
342
- return server;
343
- };
@@ -1,10 +0,0 @@
1
- {
2
- "name": "web_waf",
3
- "title": "web防火墙",
4
- "description": "用于防止sql注入、脚本注入等",
5
- "version": "1.0",
6
- "type": "web",
7
- "process_type": "common_before",
8
- "sort": 20,
9
- "state": 1
10
- }