wsemi 1.9.12 → 1.9.13

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 (501) hide show
  1. package/README.md +1 -1
  2. package/dist/wsemi.umd.js +5 -5
  3. package/dist/wsemi.umd.js.map +1 -1
  4. package/docs/-_class.mjs.html +1 -1
  5. package/docs/-_const.mjs.html +1 -1
  6. package/docs/-_detector.mjs.html +1 -1
  7. package/docs/-_optNum.mjs.html +1 -1
  8. package/docs/ab2blob.mjs.html +1 -1
  9. package/docs/ab2u8arr.mjs.html +1 -1
  10. package/docs/addExcelWorksheetFromData.mjs.html +1 -1
  11. package/docs/addMonth.mjs.html +1 -1
  12. package/docs/aes2str.mjs.html +1 -1
  13. package/docs/alive.mjs.html +1 -1
  14. package/docs/arr2dt.mjs.html +1 -1
  15. package/docs/arrAccum.mjs.html +1 -1
  16. package/docs/arrAdd.mjs.html +1 -1
  17. package/docs/arrAt.mjs.html +1 -1
  18. package/docs/arrDiff.mjs.html +1 -1
  19. package/docs/arrFilterByKeywords.mjs.html +1 -1
  20. package/docs/arrFilterByNum.mjs.html +1 -1
  21. package/docs/arrFilterByPnum.mjs.html +1 -1
  22. package/docs/arrFilterByPnumAndToLog.mjs.html +1 -1
  23. package/docs/arrFind.mjs.html +1 -1
  24. package/docs/arrGroupByMaxmin.mjs.html +1 -1
  25. package/docs/arrHas.mjs.html +1 -1
  26. package/docs/arrInsert.mjs.html +1 -1
  27. package/docs/arrLookupByMaxmin.mjs.html +1 -1
  28. package/docs/arrMax.mjs.html +1 -1
  29. package/docs/arrMin.mjs.html +1 -1
  30. package/docs/arrMulti.mjs.html +1 -1
  31. package/docs/arrNorm.mjs.html +1 -1
  32. package/docs/arrProduct.mjs.html +1 -1
  33. package/docs/arrPull.mjs.html +1 -1
  34. package/docs/arrPullAt.mjs.html +1 -1
  35. package/docs/arrReduce.mjs.html +1 -1
  36. package/docs/arrReverse.mjs.html +1 -1
  37. package/docs/arrSep.mjs.html +1 -1
  38. package/docs/arrSort.mjs.html +1 -1
  39. package/docs/asind.mjs.html +1 -1
  40. package/docs/atan2d.mjs.html +1 -1
  41. package/docs/atand.mjs.html +1 -1
  42. package/docs/attstr.mjs.html +1 -1
  43. package/docs/b642obj.mjs.html +1 -1
  44. package/docs/b642str.mjs.html +1 -1
  45. package/docs/b642u16arr.mjs.html +1 -1
  46. package/docs/b642u8arr.mjs.html +1 -1
  47. package/docs/binstr.mjs.html +1 -1
  48. package/docs/blob2ab.mjs.html +1 -1
  49. package/docs/blob2b64.mjs.html +1 -1
  50. package/docs/blob2str.mjs.html +1 -1
  51. package/docs/blob2u8arr.mjs.html +1 -1
  52. package/docs/blobs2b64s.mjs.html +1 -1
  53. package/docs/blobs2u8arrs.mjs.html +1 -1
  54. package/docs/bodyLog.mjs.html +1 -1
  55. package/docs/browserView.mjs.html +1 -1
  56. package/docs/browserViewFromBlob.mjs.html +1 -1
  57. package/docs/browserViewFromText.mjs.html +1 -1
  58. package/docs/browserViewFromU8arr.mjs.html +1 -1
  59. package/docs/bs2u8arr.mjs.html +1 -1
  60. package/docs/bufRead.mjs.html +1 -1
  61. package/docs/bufReadDbl.mjs.html +1 -1
  62. package/docs/bufWrite.mjs.html +1 -1
  63. package/docs/bufWriteDbl.mjs.html +1 -1
  64. package/docs/cache.mjs.html +1 -1
  65. package/docs/cacheBd.mjs.html +1 -1
  66. package/docs/cacheSt.mjs.html +1 -1
  67. package/docs/cbol.mjs.html +1 -1
  68. package/docs/cdbl.mjs.html +1 -1
  69. package/docs/ceil.mjs.html +1 -1
  70. package/docs/cfilesize.mjs.html +1 -1
  71. package/docs/cfinancial.mjs.html +1 -1
  72. package/docs/cint.mjs.html +1 -1
  73. package/docs/clearXSS.mjs.html +9 -2
  74. package/docs/clearXSSDyn.mjs.html +5 -3
  75. package/docs/color.mjs.html +1 -1
  76. package/docs/composeToTree.mjs.html +1 -1
  77. package/docs/convertToTree.mjs.html +1 -1
  78. package/docs/copyStrToClipboard.mjs.html +1 -1
  79. package/docs/cosd.mjs.html +1 -1
  80. package/docs/cotd.mjs.html +1 -1
  81. package/docs/createExcelWorkbook.mjs.html +1 -1
  82. package/docs/cscd.mjs.html +1 -1
  83. package/docs/cstr.mjs.html +1 -1
  84. package/docs/day2cht.mjs.html +1 -1
  85. package/docs/debounce.mjs.html +1 -1
  86. package/docs/delay.mjs.html +1 -1
  87. package/docs/detectXSS.mjs.html +17 -3
  88. package/docs/detectXSSDyn.mjs.html +1 -1
  89. package/docs/dig.mjs.html +1 -1
  90. package/docs/digExp.mjs.html +1 -1
  91. package/docs/domAlert.mjs.html +1 -1
  92. package/docs/domAppend.mjs.html +1 -1
  93. package/docs/domCancelEvent.mjs.html +1 -1
  94. package/docs/domCompareText.mjs.html +1 -1
  95. package/docs/domConvertToPic.mjs.html +1 -1
  96. package/docs/domConvertToPicDyn.mjs.html +1 -1
  97. package/docs/domDetect.mjs.html +1 -1
  98. package/docs/domDrag.mjs.html +1 -1
  99. package/docs/domDragBarAndScroll.mjs.html +1 -1
  100. package/docs/domDragPointer.mjs.html +1 -1
  101. package/docs/domDragPreview.mjs.html +1 -1
  102. package/docs/domDropFiles.mjs.html +1 -1
  103. package/docs/domElementsFromPoint.mjs.html +1 -1
  104. package/docs/domFadeIn.mjs.html +1 -1
  105. package/docs/domFadeOut.mjs.html +1 -1
  106. package/docs/domFind.mjs.html +1 -1
  107. package/docs/domFinds.mjs.html +1 -1
  108. package/docs/domGetAttr.mjs.html +1 -1
  109. package/docs/domGetBoudRect.mjs.html +1 -1
  110. package/docs/domGetBoudRectRefSelf.mjs.html +1 -1
  111. package/docs/domGetFileAccept.mjs.html +1 -1
  112. package/docs/domGetFiles.mjs.html +1 -1
  113. package/docs/domGetParents.mjs.html +1 -1
  114. package/docs/domGetPointFromEvent.mjs.html +1 -1
  115. package/docs/domGetScrollableParent.mjs.html +1 -1
  116. package/docs/domGetWindowSize.mjs.html +1 -1
  117. package/docs/domIsClientXYIn.mjs.html +1 -1
  118. package/docs/domIsFocused.mjs.html +1 -1
  119. package/docs/domIsRendered.mjs.html +1 -1
  120. package/docs/domIsStable.mjs.html +1 -1
  121. package/docs/domIsVisible.mjs.html +1 -1
  122. package/docs/domPrepend.mjs.html +1 -1
  123. package/docs/domRemove.mjs.html +1 -1
  124. package/docs/domRenderMarkdownMind.mjs.html +1 -1
  125. package/docs/domRenderMarkdownMindDyn.mjs.html +1 -1
  126. package/docs/domRipple.mjs.html +1 -1
  127. package/docs/domScrollIntoView.mjs.html +1 -1
  128. package/docs/domScrollTo.mjs.html +1 -1
  129. package/docs/domSetAttr.mjs.html +1 -1
  130. package/docs/domShowImages.mjs.html +1 -1
  131. package/docs/domShowImagesDyn.mjs.html +1 -1
  132. package/docs/domShowInputAndGetFiles.mjs.html +1 -1
  133. package/docs/domShowInputAndGetFilesU8Arrs.mjs.html +1 -1
  134. package/docs/domShowInputDatatime.mjs.html +1 -1
  135. package/docs/domTooltip.mjs.html +1 -1
  136. package/docs/domTriggerEvent.mjs.html +1 -1
  137. package/docs/domVirtualCreate.mjs.html +1 -1
  138. package/docs/domVirtualCreateQueue.mjs.html +1 -1
  139. package/docs/downloadExcelFileFromData.mjs.html +1 -1
  140. package/docs/downloadExcelFileFromDataDyn.mjs.html +1 -1
  141. package/docs/downloadFileFromB64.mjs.html +1 -1
  142. package/docs/downloadFileFromBlob.mjs.html +1 -1
  143. package/docs/downloadFileFromText.mjs.html +1 -1
  144. package/docs/downloadFileFromU8Arr.mjs.html +1 -1
  145. package/docs/dtmapping.mjs.html +1 -1
  146. package/docs/dtpick.mjs.html +1 -1
  147. package/docs/estimateTicks.mjs.html +1 -1
  148. package/docs/evEmit.mjs.html +1 -1
  149. package/docs/evEmitDelay.mjs.html +1 -1
  150. package/docs/evem.mjs.html +1 -1
  151. package/docs/examples/ex-blob2b64.html +1 -1
  152. package/docs/examples/ex-clearXSS.html +1 -1
  153. package/docs/examples/ex-clearXSSDyn.html +1 -1
  154. package/docs/examples/ex-colorConverter.html +1 -1
  155. package/docs/examples/ex-detectXSS.html +1 -1
  156. package/docs/examples/ex-detectXSSDyn.html +1 -1
  157. package/docs/examples/ex-domCompareText.html +1 -1
  158. package/docs/examples/ex-domConvertToPic.html +1 -1
  159. package/docs/examples/ex-domDrag.html +1 -1
  160. package/docs/examples/ex-domDropFiles.html +1 -1
  161. package/docs/examples/ex-domIsVisible.html +1 -1
  162. package/docs/examples/ex-domRenderMarkdownMind.html +1 -1
  163. package/docs/examples/ex-domRenderMarkdownMindDyn.html +1 -1
  164. package/docs/examples/ex-domRipple.html +1 -1
  165. package/docs/examples/ex-domScrollIntoView.html +1 -1
  166. package/docs/examples/ex-domScrollTo.html +1 -1
  167. package/docs/examples/ex-domShowImages.html +1 -1
  168. package/docs/examples/ex-domShowImagesDyn.html +1 -1
  169. package/docs/examples/ex-domShowInputAndGetFiles.html +1 -1
  170. package/docs/examples/ex-domTooltip.html +1 -1
  171. package/docs/examples/ex-getFileHash.html +1 -1
  172. package/docs/examples/ex-getUserAgent.html +1 -1
  173. package/docs/examples/ex-getUserAgentDyn.html +1 -1
  174. package/docs/examples/ex-html2str.html +1 -1
  175. package/docs/examples/ex-obj2u8arr-u8arr2obj.html +1 -1
  176. package/docs/examples/ex-openLink.html +1 -1
  177. package/docs/examples/ex-str2aes-aes2str.html +1 -1
  178. package/docs/examples/ex-str2b64-b642str.html +1 -1
  179. package/docs/examples/ex-strFindFuzz.html +1 -1
  180. package/docs/examples/ex-timeTZ2expire-timeTZ2past.html +1 -1
  181. package/docs/examples/ex-xlsx.html +1 -1
  182. package/docs/execCli.mjs.html +1 -1
  183. package/docs/execCliCore.mjs.html +1 -1
  184. package/docs/execCliJsonRpc.mjs.html +1 -1
  185. package/docs/execCliSession.mjs.html +1 -1
  186. package/docs/execJsCode.mjs.html +1 -1
  187. package/docs/execProcess.mjs.html +1 -1
  188. package/docs/execProcessKillPid.mjs.html +1 -1
  189. package/docs/filepathToTree.mjs.html +1 -1
  190. package/docs/files2data.mjs.html +1 -1
  191. package/docs/flattenToConn.mjs.html +1 -1
  192. package/docs/flattenTree.mjs.html +1 -1
  193. package/docs/floor.mjs.html +1 -1
  194. package/docs/fsBuildReadStreamText.mjs.html +1 -1
  195. package/docs/fsBuildWriteStreamText.mjs.html +1 -1
  196. package/docs/fsCleanFolder.mjs.html +1 -1
  197. package/docs/fsCleanFolderCore.mjs.html +1 -1
  198. package/docs/fsCopyFile.mjs.html +1 -1
  199. package/docs/fsCopyFileCore.mjs.html +1 -1
  200. package/docs/fsCopyFolder.mjs.html +1 -1
  201. package/docs/fsCopyFolderCore.mjs.html +1 -1
  202. package/docs/fsCreateFile.mjs.html +1 -1
  203. package/docs/fsCreateFileCore.mjs.html +1 -1
  204. package/docs/fsCreateFolder.mjs.html +1 -1
  205. package/docs/fsCreateFolderCore.mjs.html +1 -1
  206. package/docs/fsDeleteFile.mjs.html +1 -1
  207. package/docs/fsDeleteFileCore.mjs.html +1 -1
  208. package/docs/fsDeleteFileSafe.mjs.html +1 -1
  209. package/docs/fsDeleteFileSafeCore.mjs.html +1 -1
  210. package/docs/fsDeleteFolder.mjs.html +1 -1
  211. package/docs/fsDeleteFolderCore.mjs.html +1 -1
  212. package/docs/fsDeleteFolderSafe.mjs.html +1 -1
  213. package/docs/fsDeleteFolderSafeCore.mjs.html +1 -1
  214. package/docs/fsDownloadFile.mjs.html +1 -1
  215. package/docs/fsDownloadFileCore.mjs.html +1 -1
  216. package/docs/fsEvem.mjs.html +1 -1
  217. package/docs/fsExists.mjs.html +1 -1
  218. package/docs/fsExistsCore.mjs.html +1 -1
  219. package/docs/fsGetFileBasicHash.mjs.html +1 -1
  220. package/docs/fsGetFileBasicHashCore.mjs.html +1 -1
  221. package/docs/fsGetFileHash.mjs.html +1 -1
  222. package/docs/fsGetFileHashCore.mjs.html +1 -1
  223. package/docs/fsGetFileXxHash.mjs.html +1 -1
  224. package/docs/fsGetFileXxHashCore.mjs.html +1 -1
  225. package/docs/fsGetFilesInFolder.mjs.html +1 -1
  226. package/docs/fsGetFilesInFolderCore.mjs.html +1 -1
  227. package/docs/fsGetFilesWithHashInFolder.mjs.html +1 -1
  228. package/docs/fsGetFilesWithHashInFolderCore.mjs.html +1 -1
  229. package/docs/fsGetFolderBasicHash.mjs.html +1 -1
  230. package/docs/fsGetFolderBasicHashCore.mjs.html +1 -1
  231. package/docs/fsGetFoldersInFolder.mjs.html +1 -1
  232. package/docs/fsGetFoldersInFolderCore.mjs.html +1 -1
  233. package/docs/fsIsFile.mjs.html +1 -1
  234. package/docs/fsIsFileCore.mjs.html +1 -1
  235. package/docs/fsIsFolder.mjs.html +1 -1
  236. package/docs/fsIsFolderCore.mjs.html +1 -1
  237. package/docs/fsMergeFiles.mjs.html +1 -1
  238. package/docs/fsMergeFilesCore.mjs.html +1 -1
  239. package/docs/fsReadJson.mjs.html +1 -1
  240. package/docs/fsReadText.mjs.html +1 -1
  241. package/docs/fsReadTextCore.mjs.html +1 -1
  242. package/docs/fsRenameFile.mjs.html +1 -1
  243. package/docs/fsRenameFileCore.mjs.html +1 -1
  244. package/docs/fsRenameFolder.mjs.html +1 -1
  245. package/docs/fsRenameFolderCore.mjs.html +1 -1
  246. package/docs/fsSrlog.mjs.html +1 -1
  247. package/docs/fsSyncFolder.mjs.html +1 -1
  248. package/docs/fsSyncFolderCore.mjs.html +1 -1
  249. package/docs/fsTask.mjs.html +1 -1
  250. package/docs/fsTaskCp.mjs.html +1 -1
  251. package/docs/fsTreeFolder.mjs.html +1 -1
  252. package/docs/fsTreeFolderCore.mjs.html +1 -1
  253. package/docs/fsTreeFolderWithHash.mjs.html +1 -1
  254. package/docs/fsTreeFolderWithHashCore.mjs.html +1 -1
  255. package/docs/fsWatchFile.mjs.html +1 -1
  256. package/docs/fsWatchFolder.mjs.html +1 -1
  257. package/docs/fsWriteJson.mjs.html +1 -1
  258. package/docs/fsWriteText.mjs.html +1 -1
  259. package/docs/fsWriteTextCore.mjs.html +1 -1
  260. package/docs/genGradientColor.mjs.html +1 -1
  261. package/docs/genID.mjs.html +1 -1
  262. package/docs/genIDSeq.mjs.html +1 -1
  263. package/docs/genPm.mjs.html +1 -1
  264. package/docs/getBufferSize.mjs.html +1 -1
  265. package/docs/getClearPathName.mjs.html +1 -1
  266. package/docs/getCsvStrFromData.mjs.html +1 -1
  267. package/docs/getDataFromExcelFileU8Arr.mjs.html +1 -1
  268. package/docs/getDataFromExcelFileU8ArrDyn.mjs.html +1 -1
  269. package/docs/getEnv.mjs.html +1 -1
  270. package/docs/getErrorMessage.mjs.html +1 -1
  271. package/docs/getExcelU8ArrFromData.mjs.html +1 -1
  272. package/docs/getExcelU8ArrFromWorkbook.mjs.html +1 -1
  273. package/docs/getExcelWorkbookFromData.mjs.html +1 -1
  274. package/docs/getExcelWorkbookFromWorksheet.mjs.html +1 -1
  275. package/docs/getExcelWorksheetFromData.mjs.html +1 -1
  276. package/docs/getFileAccept.mjs.html +1 -1
  277. package/docs/getFileBasicHash.mjs.html +1 -1
  278. package/docs/getFileHash.mjs.html +1 -1
  279. package/docs/getFileName.mjs.html +1 -1
  280. package/docs/getFileNameExt.mjs.html +1 -1
  281. package/docs/getFileTrueName.mjs.html +1 -1
  282. package/docs/getFileType.mjs.html +1 -1
  283. package/docs/getFileXxHash.mjs.html +1 -1
  284. package/docs/getGlobal.mjs.html +1 -1
  285. package/docs/getObjSize.mjs.html +1 -1
  286. package/docs/getPathParent.mjs.html +1 -1
  287. package/docs/getTimeBetween.mjs.html +1 -1
  288. package/docs/getTimeFromUnit.mjs.html +1 -1
  289. package/docs/getTimeHp.mjs.html +1 -1
  290. package/docs/getTimeObject.mjs.html +1 -1
  291. package/docs/getTimeRange.mjs.html +1 -1
  292. package/docs/getUserAgent.mjs.html +1 -1
  293. package/docs/getUserAgentDyn.mjs.html +1 -1
  294. package/docs/getltdtkeys.mjs.html +1 -1
  295. package/docs/global.html +1 -1
  296. package/docs/haskey.mjs.html +1 -1
  297. package/docs/html2str.mjs.html +1 -1
  298. package/docs/htmlDecode.mjs.html +1 -1
  299. package/docs/htmlEncode.mjs.html +1 -1
  300. package/docs/importResources.mjs.html +1 -1
  301. package/docs/index.html +1 -1
  302. package/docs/interp1.mjs.html +1 -1
  303. package/docs/isDate.mjs.html +1 -1
  304. package/docs/isDev.mjs.html +1 -1
  305. package/docs/isEle.mjs.html +1 -1
  306. package/docs/isEleExistByID.mjs.html +1 -1
  307. package/docs/isEmail.mjs.html +1 -1
  308. package/docs/isErr.mjs.html +1 -1
  309. package/docs/isIE.mjs.html +1 -1
  310. package/docs/isNarrow.mjs.html +1 -1
  311. package/docs/isStrHasCapital.mjs.html +1 -1
  312. package/docs/isStrHasLetter.mjs.html +1 -1
  313. package/docs/isStrHasLowerCase.mjs.html +1 -1
  314. package/docs/isStrHasNumber.mjs.html +1 -1
  315. package/docs/isStrHasSpace.mjs.html +1 -1
  316. package/docs/isStrHasSymbol.mjs.html +1 -1
  317. package/docs/isUserIdentify.mjs.html +1 -1
  318. package/docs/isUserName.mjs.html +1 -1
  319. package/docs/isUserPw.mjs.html +1 -1
  320. package/docs/isWindow.mjs.html +1 -1
  321. package/docs/isab.mjs.html +1 -1
  322. package/docs/isarr.mjs.html +1 -1
  323. package/docs/isarr0.mjs.html +1 -1
  324. package/docs/isarr1.mjs.html +1 -1
  325. package/docs/isbigint.mjs.html +1 -1
  326. package/docs/isblob.mjs.html +1 -1
  327. package/docs/isbol.mjs.html +1 -1
  328. package/docs/isday.mjs.html +1 -1
  329. package/docs/isearr.mjs.html +1 -1
  330. package/docs/iseobj.mjs.html +1 -1
  331. package/docs/iser.mjs.html +1 -1
  332. package/docs/isernot.mjs.html +1 -1
  333. package/docs/isestr.mjs.html +1 -1
  334. package/docs/isfile.mjs.html +1 -1
  335. package/docs/isfun.mjs.html +1 -1
  336. package/docs/isint.mjs.html +1 -1
  337. package/docs/ismonth.mjs.html +1 -1
  338. package/docs/isn0int.mjs.html +1 -1
  339. package/docs/isn0num.mjs.html +1 -1
  340. package/docs/isnan.mjs.html +1 -1
  341. package/docs/isnbr.mjs.html +1 -1
  342. package/docs/isnint.mjs.html +1 -1
  343. package/docs/isnnum.mjs.html +1 -1
  344. package/docs/isnull.mjs.html +1 -1
  345. package/docs/isnum.mjs.html +1 -1
  346. package/docs/isobj.mjs.html +1 -1
  347. package/docs/isobj0.mjs.html +1 -1
  348. package/docs/isp0int.mjs.html +1 -1
  349. package/docs/isp0num.mjs.html +1 -1
  350. package/docs/ispint.mjs.html +1 -1
  351. package/docs/ispm.mjs.html +1 -1
  352. package/docs/ispnum.mjs.html +1 -1
  353. package/docs/isstr.mjs.html +1 -1
  354. package/docs/isstr0.mjs.html +1 -1
  355. package/docs/istime.mjs.html +1 -1
  356. package/docs/istimeTZ.mjs.html +1 -1
  357. package/docs/istimems.mjs.html +1 -1
  358. package/docs/istimemsTZ.mjs.html +1 -1
  359. package/docs/isu16arr.mjs.html +1 -1
  360. package/docs/isu8arr.mjs.html +1 -1
  361. package/docs/isundefined.mjs.html +1 -1
  362. package/docs/j2o.mjs.html +1 -1
  363. package/docs/judge.mjs.html +1 -1
  364. package/docs/keysmat2ltdt.mjs.html +1 -1
  365. package/docs/ltdt2vrtsable.mjs.html +1 -1
  366. package/docs/ltdtDiff.mjs.html +1 -1
  367. package/docs/ltdtDiffByKey.mjs.html +1 -1
  368. package/docs/ltdtkeys2mat.mjs.html +1 -1
  369. package/docs/ltdtkeysheads2mat.mjs.html +1 -1
  370. package/docs/ltdtmapping.mjs.html +1 -1
  371. package/docs/ltdtmerge.mjs.html +1 -1
  372. package/docs/ltdtpick.mjs.html +1 -1
  373. package/docs/ltdtpull.mjs.html +1 -1
  374. package/docs/mat2ltdt.mjs.html +1 -1
  375. package/docs/matConcat.mjs.html +1 -1
  376. package/docs/matDiff.mjs.html +1 -1
  377. package/docs/matat.mjs.html +1 -1
  378. package/docs/now2str.mjs.html +1 -1
  379. package/docs/now2strp.mjs.html +1 -1
  380. package/docs/nowDay2str.mjs.html +1 -1
  381. package/docs/nowms2str.mjs.html +1 -1
  382. package/docs/nowms2strp.mjs.html +1 -1
  383. package/docs/o2j.mjs.html +1 -1
  384. package/docs/obj2b64.mjs.html +1 -1
  385. package/docs/obj2pb64.mjs.html +1 -1
  386. package/docs/obj2str.mjs.html +1 -1
  387. package/docs/obj2stru8arr.mjs.html +1 -1
  388. package/docs/obj2u8arr.mjs.html +1 -1
  389. package/docs/objSortBy.mjs.html +1 -1
  390. package/docs/objSortByKeys.mjs.html +1 -1
  391. package/docs/oo.mjs.html +1 -1
  392. package/docs/openLink.mjs.html +1 -1
  393. package/docs/pb642obj.mjs.html +1 -1
  394. package/docs/pmChain.mjs.html +1 -1
  395. package/docs/pmConvertResolve.mjs.html +1 -1
  396. package/docs/pmDebounce.mjs.html +1 -1
  397. package/docs/pmHook.mjs.html +1 -1
  398. package/docs/pmHookReject.mjs.html +1 -1
  399. package/docs/pmIni.mjs.html +1 -1
  400. package/docs/pmInvResolve.mjs.html +1 -1
  401. package/docs/pmKeyMutex.mjs.html +1 -1
  402. package/docs/pmMap.mjs.html +1 -1
  403. package/docs/pmQueue.mjs.html +1 -1
  404. package/docs/pmSeries.mjs.html +1 -1
  405. package/docs/pmThrottle.mjs.html +1 -1
  406. package/docs/pmTimeout.mjs.html +1 -1
  407. package/docs/preciseNum.mjs.html +1 -1
  408. package/docs/pseudoRandom.mjs.html +1 -1
  409. package/docs/pseudoRandomIntRange.mjs.html +1 -1
  410. package/docs/pseudoRandomIntsNdpRange.mjs.html +1 -1
  411. package/docs/pseudoRandomIntsRange.mjs.html +1 -1
  412. package/docs/pseudoRandomRange.mjs.html +1 -1
  413. package/docs/pseudoRandomsRange.mjs.html +1 -1
  414. package/docs/queue.mjs.html +1 -1
  415. package/docs/random.mjs.html +1 -1
  416. package/docs/randomIntRange.mjs.html +1 -1
  417. package/docs/randomIntsNdpRange.mjs.html +1 -1
  418. package/docs/randomIntsRange.mjs.html +1 -1
  419. package/docs/randomRange.mjs.html +1 -1
  420. package/docs/randomsRange.mjs.html +1 -1
  421. package/docs/rang.mjs.html +1 -1
  422. package/docs/rep.mjs.html +1 -1
  423. package/docs/repObj.mjs.html +1 -1
  424. package/docs/replace.mjs.html +1 -1
  425. package/docs/replaceObj.mjs.html +1 -1
  426. package/docs/replacePlus.mjs.html +1 -1
  427. package/docs/round.mjs.html +1 -1
  428. package/docs/secd.mjs.html +1 -1
  429. package/docs/sep.mjs.html +1 -1
  430. package/docs/sepInt.mjs.html +1 -1
  431. package/docs/setIntervalHp.mjs.html +1 -1
  432. package/docs/setTimeoutHp.mjs.html +1 -1
  433. package/docs/sind.mjs.html +1 -1
  434. package/docs/split.mjs.html +1 -1
  435. package/docs/str2aes.mjs.html +1 -1
  436. package/docs/str2b64.mjs.html +1 -1
  437. package/docs/str2hint.mjs.html +1 -1
  438. package/docs/str2md5.mjs.html +1 -1
  439. package/docs/str2obj.mjs.html +1 -1
  440. package/docs/str2sha.mjs.html +1 -1
  441. package/docs/str2sha512.mjs.html +1 -1
  442. package/docs/str2u8arr.mjs.html +1 -1
  443. package/docs/strCompare.mjs.html +1 -1
  444. package/docs/strCompareForVersion.mjs.html +1 -1
  445. package/docs/strDiff.mjs.html +1 -1
  446. package/docs/strDiffToHtml.mjs.html +1 -1
  447. package/docs/strFindFuzz.mjs.html +1 -1
  448. package/docs/strFindSimilar.mjs.html +1 -1
  449. package/docs/strTruncate.mjs.html +1 -1
  450. package/docs/strdelleft.mjs.html +1 -1
  451. package/docs/strdelright.mjs.html +1 -1
  452. package/docs/strleft.mjs.html +1 -1
  453. package/docs/strmid.mjs.html +1 -1
  454. package/docs/strright.mjs.html +1 -1
  455. package/docs/stru8arr2obj.mjs.html +1 -1
  456. package/docs/tand.mjs.html +1 -1
  457. package/docs/time2day.mjs.html +1 -1
  458. package/docs/time2hour.mjs.html +1 -1
  459. package/docs/time2min.mjs.html +1 -1
  460. package/docs/timeTZ2day.mjs.html +1 -1
  461. package/docs/timeTZ2expire.mjs.html +1 -1
  462. package/docs/timeTZ2hour.mjs.html +1 -1
  463. package/docs/timeTZ2min.mjs.html +1 -1
  464. package/docs/timeTZ2past.mjs.html +1 -1
  465. package/docs/timems2day.mjs.html +1 -1
  466. package/docs/timems2hour.mjs.html +1 -1
  467. package/docs/timems2min.mjs.html +1 -1
  468. package/docs/timems2time.mjs.html +1 -1
  469. package/docs/timemsTZ2day.mjs.html +1 -1
  470. package/docs/timemsTZ2expire.mjs.html +1 -1
  471. package/docs/timemsTZ2hour.mjs.html +1 -1
  472. package/docs/timemsTZ2min.mjs.html +1 -1
  473. package/docs/timemsTZ2past.mjs.html +1 -1
  474. package/docs/timemsTZ2time.mjs.html +1 -1
  475. package/docs/treeObj.mjs.html +1 -1
  476. package/docs/treeToFilepath.mjs.html +1 -1
  477. package/docs/trim.mjs.html +1 -1
  478. package/docs/u16arr2b64.mjs.html +1 -1
  479. package/docs/u16arr2u8arr.mjs.html +1 -1
  480. package/docs/u8arr2ab.mjs.html +1 -1
  481. package/docs/u8arr2b64.mjs.html +1 -1
  482. package/docs/u8arr2blob.mjs.html +1 -1
  483. package/docs/u8arr2bs.mjs.html +1 -1
  484. package/docs/u8arr2obj.mjs.html +1 -1
  485. package/docs/u8arr2str.mjs.html +1 -1
  486. package/docs/u8arr2u16arr.mjs.html +1 -1
  487. package/docs/urlParse.mjs.html +1 -1
  488. package/docs/verifyValue.mjs.html +1 -1
  489. package/docs/waitFun.mjs.html +1 -1
  490. package/docs/wsemi.html +112 -9
  491. package/package.json +1 -1
  492. package/src/_filterXSS.mjs +16 -1
  493. package/src/clearXSS.mjs +8 -1
  494. package/src/clearXSSDyn.mjs +4 -2
  495. package/src/detectXSS.mjs +16 -2
  496. package/test/_filterXSS.test.mjs +18 -0
  497. package/test/clearXSS.test.mjs +148 -6
  498. package/test/detectXSS.test.mjs +10 -0
  499. package/toolfp/dist/wsemip.umd.js +1 -1
  500. package/toolparfor/dist/wpf.umd.js +1 -1
  501. package/toolparfor/dist/wpf_pmSeries.umd.js +1 -1
@@ -111,7 +111,7 @@ export default urlParse
111
111
  <br class="clear">
112
112
 
113
113
  <footer>
114
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Oct 11 2026 08:43:48 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
114
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Oct 12 2026 12:18:17 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
115
115
  </footer>
116
116
 
117
117
  <script>prettyPrint();</script>
@@ -224,7 +224,7 @@ export default verifyValue
224
224
  <br class="clear">
225
225
 
226
226
  <footer>
227
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Oct 11 2026 08:43:48 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
227
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Oct 12 2026 12:18:17 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
228
228
  </footer>
229
229
 
230
230
  <script>prettyPrint();</script>
@@ -215,7 +215,7 @@ export default waitFun
215
215
  <br class="clear">
216
216
 
217
217
  <footer>
218
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Oct 11 2026 08:43:48 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
218
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Oct 12 2026 12:18:17 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
219
219
  </footer>
220
220
 
221
221
  <script>prettyPrint();</script>
package/docs/wsemi.html CHANGED
@@ -15465,13 +15465,15 @@ await test3()
15465
15465
  <dt class="tag-description">Description:</dt>
15466
15466
  <dd class="tag-description"><ul class="dummy"><li><p>清除xss攻擊語法</p>
15467
15467
  <p>Depend on: <a href="https://jsxss.com/zh/index.html">https://jsxss.com/zh/index.html</a></p>
15468
+ <p>白名單外之標籤轉義,白名單內之標籤刪除白名單外之屬性與危險網址(style屬性保留),標籤外之文字只轉義會開始標籤之&lt;(其後為英文字母、斜線、驚嘆號、問號或位於結尾),&gt;與其餘之&lt;維持原樣,故'a &lt; b'等數學式不改寫</p>
15469
+ <p>輸出僅供以HTML內文呈現(如v-html、innerHTML),不可放入屬性值或註解內</p>
15468
15470
  <p>Unit Test: <a href="https://github.com/yuda-lyu/wsemi/blob/master/test/clearXSS.test.mjs">Github</a></p></li></ul></dd>
15469
15471
 
15470
15472
 
15471
15473
 
15472
15474
  <dt class="tag-source">Source:</dt>
15473
15475
  <dd class="tag-source"><ul class="dummy"><li>
15474
- <a href="clearXSS.mjs.html">clearXSS.mjs</a>, <a href="clearXSS.mjs.html#line27">line 27</a>
15476
+ <a href="clearXSS.mjs.html">clearXSS.mjs</a>, <a href="clearXSS.mjs.html#line34">line 34</a>
15475
15477
  </li></ul></dd>
15476
15478
 
15477
15479
 
@@ -15518,7 +15520,7 @@ await test3()
15518
15520
 
15519
15521
  <h5 class="h5-examples">Example</h5>
15520
15522
 
15521
- <pre class="prettyprint"><code>console.log(clearXSS(`>&lt;script>alert('XSS')&lt;/script>`))
15523
+ <pre class="prettyprint"><code>console.log(clearXSS(`>&lt;script>alert('XSS')&lt;/script>`))
15522
15524
 
15523
15525
 
15524
15526
 
@@ -15630,7 +15632,7 @@ await test3()
15630
15632
 
15631
15633
 
15632
15634
 
15633
- <h4 class="name" id=".clearXSSDyn"><span class="type-signature type-signature-async, static">(async, static) </span>clearXSSDyn<span class="signature">(inp)</span><span class="type-signature"> &rarr; {Promise}</span></h4>
15635
+ <h4 class="name" id=".clearXSSDyn"><span class="type-signature type-signature-async, static">(async, static) </span>clearXSSDyn<span class="signature">(inp, opt<span class="signature-attributes">opt</span>, pathItems)</span><span class="type-signature"> &rarr; {Promise}</span></h4>
15634
15636
 
15635
15637
 
15636
15638
 
@@ -15640,7 +15642,7 @@ await test3()
15640
15642
  <dl class="details">
15641
15643
 
15642
15644
  <dt class="tag-description">Description:</dt>
15643
- <dd class="tag-description"><ul class="dummy"><li><p>清除xss攻擊語法,採用動態加載技術</p>
15645
+ <dd class="tag-description"><ul class="dummy"><li><p>清除xss攻擊語法,採用動態加載技術,處理規則同clearXSS</p>
15644
15646
  <p>Depend on: <a href="https://jsxss.com/zh/index.html">https://jsxss.com/zh/index.html</a></p>
15645
15647
  <p>Unit Test: <a href="https://github.com/yuda-lyu/wsemi/blob/master/test/clearXSSDyn.test.mjs">Github</a></p></li></ul></dd>
15646
15648
 
@@ -15648,7 +15650,7 @@ await test3()
15648
15650
 
15649
15651
  <dt class="tag-source">Source:</dt>
15650
15652
  <dd class="tag-source"><ul class="dummy"><li>
15651
- <a href="clearXSSDyn.mjs.html">clearXSSDyn.mjs</a>, <a href="clearXSSDyn.mjs.html#line28">line 28</a>
15653
+ <a href="clearXSSDyn.mjs.html">clearXSSDyn.mjs</a>, <a href="clearXSSDyn.mjs.html#line30">line 30</a>
15652
15654
  </li></ul></dd>
15653
15655
 
15654
15656
 
@@ -15695,7 +15697,7 @@ await test3()
15695
15697
 
15696
15698
  <h5 class="h5-examples">Example</h5>
15697
15699
 
15698
- <pre class="prettyprint"><code>let r
15700
+ <pre class="prettyprint"><code>let r
15699
15701
 
15700
15702
 
15701
15703
 
@@ -15713,8 +15715,12 @@ await test3()
15713
15715
  <th>Type</th>
15714
15716
 
15715
15717
 
15718
+ <th>Attributes</th>
15719
+
15716
15720
 
15717
15721
 
15722
+ <th>Default</th>
15723
+
15718
15724
 
15719
15725
  <th class="last">Description</th>
15720
15726
  </tr>
@@ -15745,13 +15751,107 @@ await test3()
15745
15751
  </td>
15746
15752
 
15747
15753
 
15754
+ <td class="attributes">
15755
+
15748
15756
 
15757
+
15758
+
15759
+
15760
+ </td>
15761
+
15762
+
15763
+
15764
+ <td class="default">
15765
+
15766
+ </td>
15749
15767
 
15750
15768
 
15751
15769
  <td class="description last"><p>輸入資料</p></td>
15752
15770
  </tr>
15753
15771
 
15754
15772
 
15773
+
15774
+ <tr>
15775
+
15776
+ <td class="name"><code>opt</code></td>
15777
+
15778
+
15779
+ <td class="type">
15780
+
15781
+
15782
+ <span class="param-type">Object</span>
15783
+
15784
+
15785
+
15786
+
15787
+ </td>
15788
+
15789
+
15790
+ <td class="attributes">
15791
+
15792
+ &lt;optional><br>
15793
+
15794
+
15795
+
15796
+
15797
+
15798
+ </td>
15799
+
15800
+
15801
+
15802
+ <td class="default">
15803
+
15804
+ <code>{}</code>
15805
+
15806
+ </td>
15807
+
15808
+
15809
+ <td class="description last"><p>輸入設定物件,保留簽名相容,目前不使用</p></td>
15810
+ </tr>
15811
+
15812
+
15813
+
15814
+ <tr>
15815
+
15816
+ <td class="name"><code>pathItems</code></td>
15817
+
15818
+
15819
+ <td class="type">
15820
+
15821
+
15822
+ <span class="param-type">String</span>
15823
+ |
15824
+
15825
+ <span class="param-type">Object</span>
15826
+ |
15827
+
15828
+ <span class="param-type">Array</span>
15829
+
15830
+
15831
+
15832
+
15833
+ </td>
15834
+
15835
+
15836
+ <td class="attributes">
15837
+
15838
+
15839
+
15840
+
15841
+
15842
+ </td>
15843
+
15844
+
15845
+
15846
+ <td class="default">
15847
+
15848
+ </td>
15849
+
15850
+
15851
+ <td class="description last"><p>輸入資源字串、字串陣列、物件、物件陣列</p></td>
15852
+ </tr>
15853
+
15854
+
15755
15855
  </tbody>
15756
15856
  </table>
15757
15857
 
@@ -18830,7 +18930,7 @@ console.log(wb)
18830
18930
  <p>與clearXSS共用同一份js-xss設定(白名單、網址判定、白名單外之style屬性保留),判定規則:</p>
18831
18931
  <ol>
18832
18932
  <li>
18833
- <p>標籤(type為'tag'):白名單外之標籤,名稱由原始標籤片段取得且其後須接空白、斜線、大於或結尾,故含'&lt;svg/onload=...&gt;',不含'孔深 &lt; 500 m'、'5&lt;6&gt;4'、'&lt;o:p&gt;'</p>
18933
+ <p>標籤(type為'tag'):白名單外之標籤,名稱由原始標籤片段取得且其後須接空白、斜線、大於或結尾,故含'&lt;svg/onload=...&gt;',不含'孔深 &lt; 500 m'、'5&lt;6&gt;4'、'&lt;o:p&gt;';結尾未閉合且無屬性之白名單標籤(如'若 a&lt;b'之'&lt;b')亦不計</p>
18834
18934
  </li>
18835
18935
  <li>
18836
18936
  <p>屬性(type為'attr'):白名單內標籤被刪除之事件屬性,名稱為on接英文字母且有值,故不含'a<b and once>c'之once</p>
@@ -18852,7 +18952,7 @@ console.log(wb)
18852
18952
 
18853
18953
  <dt class="tag-source">Source:</dt>
18854
18954
  <dd class="tag-source"><ul class="dummy"><li>
18855
- <a href="detectXSS.mjs.html">detectXSS.mjs</a>, <a href="detectXSS.mjs.html#line92">line 92</a>
18955
+ <a href="detectXSS.mjs.html">detectXSS.mjs</a>, <a href="detectXSS.mjs.html#line95">line 95</a>
18856
18956
  </li></ul></dd>
18857
18957
 
18858
18958
 
@@ -18917,6 +19017,9 @@ console.log(detectXSS('&amp;lt;b&amp;gt; 為粗體標籤'))
18917
19017
  console.log(detectXSS('孔深 &lt; 500 m 且 > 10 m'))
18918
19018
  // => []
18919
19019
 
19020
+ console.log(detectXSS('若 a&lt;b'))
19021
+ // => []
19022
+
18920
19023
  console.log(detectXSS('a&lt;b and once>c'))
18921
19024
  // => []
18922
19025
 
@@ -110548,7 +110651,7 @@ console.log(u8arr2u16arr('abc', { returnWithStateAndMsg: true }))
110548
110651
  <br class="clear">
110549
110652
 
110550
110653
  <footer>
110551
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Oct 11 2026 08:43:48 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
110654
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Oct 12 2026 12:18:18 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
110552
110655
  </footer>
110553
110656
 
110554
110657
  <script>prettyPrint();</script>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wsemi",
3
- "version": "1.9.12",
3
+ "version": "1.9.13",
4
4
  "main": "dist/wsemi.umd.js",
5
5
  "dependencies": {
6
6
  "@zumer/snapdom": "^3.3.0",
@@ -30,9 +30,24 @@ function getFilterXSS(mod = xss) {
30
30
  }
31
31
 
32
32
 
33
- //getOpt, 取得clearXSS與detectXSS共用之js-xss設定(單一出處), 白名單、網址判定與白名單外標籤之處理皆用js-xss預設, 只另保留白名單外之style屬性(值跳脫<>")
33
+ //reTagStart, 會開始標籤之<: 依HTML規格(Tag open state), <後接英文字母、斜線、驚嘆號或問號才進入標籤、結束標籤、註解等狀態, 其餘之<為一般文字
34
+ //結尾之<亦轉義: 其後字元由組裝處決定, 如兩欄相鄰組進畫面時, 前一欄結尾之<會與後一欄開頭之字母拼成標籤
35
+ //js-xss會分段呼叫escapeHtml, 段尾之<亦視為結尾而轉義, 只多轉義不影響安全(如'a << b'為'a &lt;< b')
36
+ let reTagStart = /<(?=[A-Za-z!/?]|$)/g
37
+
38
+
39
+ //escapeHtml, 取代js-xss預設之escapeHtml(<與>全部轉義), 只轉義會開始標籤之<, 令數學式、箭頭、markdown引用等之<與>維持原樣
40
+ //js-xss以此處理標籤外之文字與白名單外之標籤; >於標籤外恆為一般文字故不轉義; 白名單內標籤之屬性值由js-xss之escapeAttrValue另行轉義<>"而不經此函數
41
+ //輸出僅供HTML內文使用, 放入屬性值或註解內並不安全(引號、空白與'-->'皆未轉義)
42
+ function escapeHtml(html) {
43
+ return html.replace(reTagStart, '&lt;')
44
+ }
45
+
46
+
47
+ //getOpt, 取得clearXSS與detectXSS共用之js-xss設定(單一出處), 白名單、網址判定與白名單外標籤之處理皆用js-xss預設, 另保留白名單外之style屬性(值跳脫<>"), 文字之轉義改用escapeHtml
34
48
  function getOpt(filterXSS) {
35
49
  return {
50
+ escapeHtml,
36
51
  onIgnoreTagAttr: function(tag, name, value, isWhiteAttr) {
37
52
  if (name === 'style') {
38
53
  return name + '="' + filterXSS.escapeAttrValue(value) + '"'
package/src/clearXSS.mjs CHANGED
@@ -11,6 +11,10 @@ import fxss from './_filterXSS.mjs'
11
11
  *
12
12
  * Depend on: {@link https://jsxss.com/zh/index.html https://jsxss.com/zh/index.html}
13
13
  *
14
+ * 白名單外之標籤轉義,白名單內之標籤刪除白名單外之屬性與危險網址(style屬性保留),標籤外之文字只轉義會開始標籤之<(其後為英文字母、斜線、驚嘆號、問號或位於結尾),>與其餘之<維持原樣,故'a < b'等數學式不改寫
15
+ *
16
+ * 輸出僅供以HTML內文呈現(如v-html、innerHTML),不可放入屬性值或註解內
17
+ *
14
18
  * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/clearXSS.test.mjs Github}
15
19
  * @memberOf wsemi
16
20
  * @param {String|Object|Array} inp 輸入資料
@@ -18,11 +22,14 @@ import fxss from './_filterXSS.mjs'
18
22
  * @example
19
23
  *
20
24
  * console.log(clearXSS(`><script>alert('XSS')</script>`))
21
- * // => `&gt;&lt;script&gt;alert('XSS')&lt;/script&gt;`
25
+ * // => `>&lt;script>alert('XSS')&lt;/script>`
22
26
  *
23
27
  * console.log(clearXSS(`<img src="javascript:alert('XSS')">`))
24
28
  * // => `<img src>`
25
29
  *
30
+ * console.log(clearXSS(`孔深 < 500 m 且 > 10 m`))
31
+ * // => `孔深 < 500 m 且 > 10 m`
32
+ *
26
33
  */
27
34
  function clearXSS(inp) {
28
35
 
@@ -4,13 +4,15 @@ import clearXSS from './clearXSS.mjs'
4
4
 
5
5
 
6
6
  /**
7
- * 清除xss攻擊語法,採用動態加載技術
7
+ * 清除xss攻擊語法,採用動態加載技術,處理規則同clearXSS
8
8
  *
9
9
  * Depend on: {@link https://jsxss.com/zh/index.html https://jsxss.com/zh/index.html}
10
10
  *
11
11
  * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/clearXSSDyn.test.mjs Github}
12
12
  * @memberOf wsemi
13
13
  * @param {String|Object|Array} inp 輸入資料
14
+ * @param {Object} [opt={}] 輸入設定物件,保留簽名相容,目前不使用
15
+ * @param {String|Object|Array} pathItems 輸入資源字串、字串陣列、物件、物件陣列
14
16
  * @returns {Promise} 回傳Promise,resolve回傳輸出資料,reject回傳錯誤訊息
15
17
  * @example
16
18
  *
@@ -18,7 +20,7 @@ import clearXSS from './clearXSS.mjs'
18
20
  *
19
21
  * r = await clearXSSDyn(`><script>alert('XSS')</script>`)
20
22
  * console.log(r)
21
- * // => `&gt;&lt;script&gt;alert('XSS')&lt;/script&gt;`
23
+ * // => `>&lt;script>alert('XSS')&lt;/script>`
22
24
  *
23
25
  * r = await clearXSSDyn(`<img src="javascript:alert('XSS')">`)
24
26
  * console.log(r)
package/src/detectXSS.mjs CHANGED
@@ -43,7 +43,7 @@ function getScheme(value) {
43
43
  *
44
44
  * 與clearXSS共用同一份js-xss設定(白名單、網址判定、白名單外之style屬性保留),判定規則:
45
45
  *
46
- * 1. 標籤(type為'tag'):白名單外之標籤,名稱由原始標籤片段取得且其後須接空白、斜線、大於或結尾,故含'<svg/onload=...>',不含'孔深 < 500 m'、'5<6>4'、'<o:p>'
46
+ * 1. 標籤(type為'tag'):白名單外之標籤,名稱由原始標籤片段取得且其後須接空白、斜線、大於或結尾,故含'<svg/onload=...>',不含'孔深 < 500 m'、'5<6>4'、'<o:p>';結尾未閉合且無屬性之白名單標籤(如'若 a<b'之'<b')亦不計
47
47
  *
48
48
  * 2. 屬性(type為'attr'):白名單內標籤被刪除之事件屬性,名稱為on接英文字母且有值,故不含'a<b and once>c'之once
49
49
  *
@@ -79,6 +79,9 @@ function getScheme(value) {
79
79
  * console.log(detectXSS('孔深 < 500 m 且 > 10 m'))
80
80
  * // => []
81
81
  *
82
+ * console.log(detectXSS('若 a<b'))
83
+ * // => []
84
+ *
82
85
  * console.log(detectXSS('a<b and once>c'))
83
86
  * // => []
84
87
  *
@@ -105,6 +108,12 @@ function detectXSS(str) {
105
108
  let baseOnIgnoreTagAttr = opt.onIgnoreTagAttr || filterXSS.onIgnoreTagAttr
106
109
  let baseSafeAttrValue = opt.safeAttrValue || filterXSS.safeAttrValue
107
110
 
111
+ //isWhiteTag, 是否為白名單標籤, 同js-xss以自身屬性判定(不含原型鍵)
112
+ let whiteList = opt.whiteList || filterXSS.whiteList
113
+ let isWhiteTag = (name) => {
114
+ return Object.prototype.hasOwnProperty.call(whiteList, name)
115
+ }
116
+
108
117
  //rs, add, 重複項目合併為1筆
109
118
  let rs = []
110
119
  let ks = {}
@@ -128,7 +137,12 @@ function detectXSS(str) {
128
137
  if (r === undefined || r === null) {
129
138
  let m = reTagName.exec(html)
130
139
  if (m) {
131
- add({ type: 'tag', tag: m[1].toLowerCase() })
140
+ let name = m[1].toLowerCase()
141
+ //結尾未閉合且無屬性之標籤(原始片段恰為'<名稱'或'</名稱'), js-xss取名會少一字而歸為白名單外, 名稱實為白名單者不計(如'若 a<b'之'<b')
142
+ if (html.length === m[0].length && isWhiteTag(name)) {
143
+ return r
144
+ }
145
+ add({ type: 'tag', tag: name })
132
146
  }
133
147
  }
134
148
  return r
@@ -85,6 +85,24 @@ describe(`_filterXSS`, function() {
85
85
  assert.strict.deepStrictEqual(r, '<img src="https://a/b.png">')
86
86
  })
87
87
 
88
+ it(`should escape in text only the < that starts a tag or ends the string`, function() {
89
+ //<後接英文字母、斜線、驚嘆號、問號或位於結尾者轉義, >與其餘之<不轉義
90
+ let opt = fxss.getOpt(xss)
91
+ assert.strict.deepStrictEqual(xss('a < b > c', opt), 'a < b > c')
92
+ assert.strict.deepStrictEqual(xss('x<y', opt), 'x&lt;y')
93
+ assert.strict.deepStrictEqual(xss('x</y', opt), 'x&lt;/y')
94
+ assert.strict.deepStrictEqual(xss('x<!y', opt), 'x&lt;!y')
95
+ assert.strict.deepStrictEqual(xss('x<?y', opt), 'x&lt;?y')
96
+ assert.strict.deepStrictEqual(xss('a <', opt), 'a &lt;')
97
+ assert.strict.deepStrictEqual(xss('<svg onload=x()>', opt), '&lt;svg onload=x()>')
98
+ })
99
+
100
+ it(`should not change the escaping of attribute values`, function() {
101
+ //白名單內標籤之屬性值由js-xss之escapeAttrValue轉義<>", 不經文字之轉義
102
+ let r = xss('<a href="https://a/b" title="a<b>c">x</a>', fxss.getOpt(xss))
103
+ assert.strict.deepStrictEqual(r, '<a href="https://a/b" title="a&lt;b&gt;c">x</a>')
104
+ })
105
+
88
106
  })
89
107
 
90
108
  })
@@ -1,4 +1,5 @@
1
1
  import assert from 'assert'
2
+ import xss from 'xss'
2
3
  import clearXSS from '../src/clearXSS.mjs'
3
4
 
4
5
 
@@ -9,7 +10,7 @@ describe(`clearXSS`, function() {
9
10
 
10
11
  k = 1
11
12
  x[k] = `><script>alert('XSS')</script>`
12
- fx[k] = `&gt;&lt;script&gt;alert('XSS')&lt;/script&gt;`
13
+ fx[k] = `>&lt;script>alert('XSS')&lt;/script>`
13
14
  it(`should return ' + fx[k] + ' when input ' + x[k]`, function() {
14
15
  k = 1
15
16
  let r = clearXSS(x[k])
@@ -18,7 +19,7 @@ describe(`clearXSS`, function() {
18
19
 
19
20
  k = 2
20
21
  x[k] = `='><script>alert('XSS')</script>`
21
- fx[k] = `='&gt;&lt;script&gt;alert('XSS')&lt;/script&gt;`
22
+ fx[k] = `='>&lt;script>alert('XSS')&lt;/script>`
22
23
  it(`should return ' + fx[k] + ' when input ' + x[k]`, function() {
23
24
  k = 2
24
25
  let r = clearXSS(x[k])
@@ -27,7 +28,7 @@ describe(`clearXSS`, function() {
27
28
 
28
29
  k = 3
29
30
  x[k] = `"><script>alert('XSS')</script>`
30
- fx[k] = `"&gt;&lt;script&gt;alert('XSS')&lt;/script&gt;`
31
+ fx[k] = `">&lt;script>alert('XSS')&lt;/script>`
31
32
  it(`should return ' + fx[k] + ' when input ' + x[k]`, function() {
32
33
  k = 3
33
34
  let r = clearXSS(x[k])
@@ -36,7 +37,7 @@ describe(`clearXSS`, function() {
36
37
 
37
38
  k = 4
38
39
  x[k] = `<script>alert('XSS')</script>`
39
- fx[k] = `&lt;script&gt;alert('XSS')&lt;/script&gt;`
40
+ fx[k] = `&lt;script>alert('XSS')&lt;/script>`
40
41
  it(`should return ' + fx[k] + ' when input ' + x[k]`, function() {
41
42
  k = 4
42
43
  let r = clearXSS(x[k])
@@ -45,7 +46,7 @@ describe(`clearXSS`, function() {
45
46
 
46
47
  k = 5
47
48
  x[k] = `<script>alert (vulnerable)</script>`
48
- fx[k] = `&lt;script&gt;alert (vulnerable)&lt;/script&gt;`
49
+ fx[k] = `&lt;script>alert (vulnerable)&lt;/script>`
49
50
  it(`should return ' + fx[k] + ' when input ' + x[k]`, function() {
50
51
  k = 5
51
52
  let r = clearXSS(x[k])
@@ -63,7 +64,7 @@ describe(`clearXSS`, function() {
63
64
 
64
65
  k = 7
65
66
  x[k] = `<script>alert('XSS')</script>`
66
- fx[k] = `&lt;script&gt;alert('XSS')&lt;/script&gt;`
67
+ fx[k] = `&lt;script>alert('XSS')&lt;/script>`
67
68
  it(`should return ' + fx[k] + ' when input ' + x[k]`, function() {
68
69
  k = 7
69
70
  let r = clearXSS(x[k])
@@ -181,4 +182,145 @@ describe(`clearXSS`, function() {
181
182
  assert.strict.deepStrictEqual(r, NaN)
182
183
  })
183
184
 
185
+ describe(`標籤外之文字只轉義會開始標籤之<`, function() {
186
+
187
+ //不會開始標籤之<(後接空白、數字、符號、非英文字母)與標籤外之>維持原樣
188
+ let keep = [
189
+ 'a < b',
190
+ '1 > 0',
191
+ 'x <= 5',
192
+ 'x>=3',
193
+ '溫度 > 30°C',
194
+ '孔深 < 500 m 且 > 10 m',
195
+ 'if (a < b && c > d)',
196
+ '<3',
197
+ '2<3',
198
+ 'x<=y',
199
+ '3<4>2',
200
+ '<新增>',
201
+ '輸入 -> 輸出 <- 回饋',
202
+ '> 引用一段話\n\n- 若 a < b 則停止\n- `x => y`',
203
+ ]
204
+ for (let s of keep) {
205
+ it(`should keep ${JSON.stringify(s)}`, function() {
206
+ assert.strict.deepStrictEqual(clearXSS(s), s)
207
+ })
208
+ }
209
+
210
+ //<後接英文字母、斜線、驚嘆號、問號, 或位於結尾者轉義(結尾之<於兩欄相鄰組進畫面時會與後一欄開頭拼成標籤)
211
+ let esc = [
212
+ ['a<b', 'a&lt;b'],
213
+ ['x<y>z', 'x&lt;y>z'],
214
+ ['a <', 'a &lt;'],
215
+ ['x<', 'x&lt;'],
216
+ ['請見 <https://example.com>', '請見 &lt;https://example.com>'],
217
+ ['<script>alert(1)</script>', '&lt;script>alert(1)&lt;/script>'],
218
+ ['<SCRIPT>alert(1)</SCRIPT>', '&lt;SCRIPT>alert(1)&lt;/SCRIPT>'],
219
+ ['A<B', 'A&lt;B'],
220
+ ['<img src="x" onerror="alert(1)"', '&lt;img src="x" onerror="alert(1)"'],
221
+ ['<svg onload=alert(1)//', '&lt;svg onload=alert(1)//'],
222
+ ['</title><script>alert(1)</script>', '&lt;/title>&lt;script>alert(1)&lt;/script>'],
223
+ ['<!DOCTYPE html>', '&lt;!DOCTYPE html>'],
224
+ ['<?xml version="1.0"?><script>alert(1)</script>', '&lt;?xml version="1.0"?>&lt;script>alert(1)&lt;/script>'],
225
+ ]
226
+ for (let [s, e] of esc) {
227
+ it(`should escape ${JSON.stringify(s)}`, function() {
228
+ assert.strict.deepStrictEqual(clearXSS(s), e)
229
+ })
230
+ }
231
+
232
+ it(`should escape the former of two adjacent <`, function() {
233
+ //js-xss於第二個<前切段而分段轉義, 前者位於段尾視為結尾而轉義, 只多轉義不影響安全
234
+ assert.strict.deepStrictEqual(clearXSS('a << b'), 'a &lt;< b')
235
+ assert.strict.deepStrictEqual(clearXSS('x <<= 2'), 'x &lt;<= 2')
236
+ })
237
+
238
+ it(`should apply to strings inside objects and arrays`, function() {
239
+ let r = clearXSS({ a: 'a < b', b: ['<script>', 1] })
240
+ assert.strict.deepStrictEqual(r, { a: 'a < b', b: ['&lt;script>', 1] })
241
+ })
242
+
243
+ })
244
+
245
+ describe(`白名單內標籤、事件屬性、網址、style、屬性值與註解之處理不變`, function() {
246
+
247
+ let same = [
248
+ ['<img src=x onerror=alert(1)>', '<img src>'],
249
+ ['<b onclick=alert(1)>x</b>', '<b>x</b>'],
250
+ ['<a href="javascript:alert(1)">x</a>', '<a href>x</a>'],
251
+ ['a<b and c>d', 'a<b>d'],
252
+ ['<div style="a:b<c" title="t">x</div>', '<div style="a:b&lt;c">x</div>'],
253
+ ['<!-- x -->y', 'y'],
254
+ //白名單內標籤之屬性值仍由js-xss之escapeAttrValue轉義<>", 不經文字之轉義
255
+ ['<img alt="1 > 0" src="https://a/b.png">', '<img alt="1 &gt; 0" src="https://a/b.png">'],
256
+ ['<a href="https://a/b" title="a<b>c">x</a>', '<a href="https://a/b" title="a&lt;b&gt;c">x</a>'],
257
+ [`<a title='x"y'>z</a>`, '<a title="x&quot;y">z</a>'],
258
+ ]
259
+ for (let [s, e] of same) {
260
+ it(`should keep the handling of ${JSON.stringify(s)}`, function() {
261
+ assert.strict.deepStrictEqual(clearXSS(s), e)
262
+ })
263
+ }
264
+
265
+ })
266
+
267
+ describe(`兩欄各自清除後相連不會拼出標籤`, function() {
268
+
269
+ //相連結果中會開始標籤之<只能是js-xss重建之白名單標籤且不帶事件屬性, 結尾亦不得留下<
270
+ let reStart = /<(?=[A-Za-z!/?]|$)/g
271
+ let reTag = /^<\/?([A-Za-z][A-Za-z0-9-]*)(\s[^<>]*)?\/?>$/
272
+ let isWhite = (name) => Object.prototype.hasOwnProperty.call(xss.whiteList, name)
273
+ let findBad = (r) => {
274
+ reStart.lastIndex = 0
275
+ let m
276
+ while ((m = reStart.exec(r)) !== null) {
277
+ let j = r.indexOf('>', m.index)
278
+ if (j < 0) {
279
+ return `unclosed: ${r.slice(m.index)}`
280
+ }
281
+ let t = r.slice(m.index, j + 1)
282
+ let mt = reTag.exec(t)
283
+ if (!mt || !isWhite(mt[1].toLowerCase())) {
284
+ return `tag: ${t}`
285
+ }
286
+ if (/\son[a-z]+\s*=/i.test(t)) {
287
+ return `event: ${t}`
288
+ }
289
+ reStart.lastIndex = j + 1
290
+ }
291
+ return ''
292
+ }
293
+
294
+ let attacks = [
295
+ '<script>alert(1)</script>',
296
+ '<img src=x onerror=alert(1)>',
297
+ '<svg onload=alert(1)>',
298
+ '<svg/onload=alert(1)>',
299
+ '<a href="javascript:alert(1)">x</a>',
300
+ '<iframe src=javascript:alert(1)>',
301
+ '<b onclick=alert(1)>x</b>',
302
+ '<!--><svg onload=alert(1)>-->',
303
+ '<?xml?><svg onload=alert(1)>',
304
+ '</title><script>alert(1)</script>',
305
+ 'x<img src=1 onerror=alert(1)>',
306
+ 'a <b>粗體</b> c',
307
+ '<table><tr><td>t</td></tr></table>',
308
+ ]
309
+
310
+ it(`should not form tags when two cleared fields are joined at any position`, function() {
311
+ let bad = []
312
+ for (let s of attacks) {
313
+ for (let i = 1; i < s.length; i++) {
314
+ let r = clearXSS(s.slice(0, i)) + clearXSS(s.slice(i))
315
+ let err = findBad(r)
316
+ if (err) {
317
+ bad.push({ s, i, r, err })
318
+ }
319
+ }
320
+ }
321
+ assert.strict.deepStrictEqual(bad, [])
322
+ })
323
+
324
+ })
325
+
184
326
  })
@@ -53,6 +53,16 @@ describe(`detectXSS`, function() {
53
53
 
54
54
  it(`should report the full name of an unclosed tag at the end`, function() {
55
55
  check('<script', [tag('script')])
56
+ check('x<y', [tag('y')])
57
+ check('<img/src="x"/onerror=alert(1)', [tag('img')])
58
+ })
59
+
60
+ it(`should not report a whitelisted tag left unclosed without attributes at the end`, function() {
61
+ //js-xss對結尾未閉合且無屬性之標籤取名少一字而歸為白名單外, 名稱實為白名單者不計
62
+ check('a<b', [])
63
+ check('若 a<b', [])
64
+ check('a</b', [])
65
+ check('<img', [])
56
66
  })
57
67
 
58
68
  it(`should report form controls and custom elements`, function() {
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * wsemip v1.9.12
2
+ * wsemip v1.9.13
3
3
  * (c) 2018-2021 yuda-lyu(semisphere)
4
4
  * Released under the MIT License.
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * wpf v1.9.12
2
+ * wpf v1.9.13
3
3
  * (c) 2018-2021 yuda-lyu(semisphere)
4
4
  * Released under the MIT License.
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * wpf_pmSeries v1.9.12
2
+ * wpf_pmSeries v1.9.13
3
3
  * (c) 2018-2021 yuda-lyu(semisphere)
4
4
  * Released under the MIT License.
5
5
  */