{"app_version":"v261018-go","code_manifest":[{"desc":"\u95e8\u6237\u4e3b\u7a0b\u5e8f\uff1a\u4f1a\u8bdd\u3001\u5b89\u5168\u54cd\u5e94\u5934\u3001CSRF \u7eb5\u6df1\u6821\u9a8c\u3001\u5bc6\u7801\u54c8\u5e0c\u3001\u52a0\u5bc6\u5f52\u6863","exists":true,"mtime":"2026-11-04 18:02:31","path":"app.py","sha256":"20a1361d70ba1fad708aad9747c6d2cf71a5cb0a64caa8cf48765d7ecca10e0d","size":214330},{"desc":"\u767b\u5f55/\u6ce8\u518c/\u6539\u5bc6/\u98ce\u63a7\uff1a\u5931\u8d25\u8ba1\u6570\u3001\u9650\u6d41\u3001\u8bbe\u5907\u6307\u7eb9","exists":true,"mtime":"2026-10-17 09:01:21","path":"routes/auth_points_routes.py","sha256":"66b440c8a87c96a19c68c9420ba5c3b1b0321416ac3567b7aedfe2124444cd94","size":106901},{"desc":"\u5b89\u5168\u4e8b\u4ef6\u65f6\u95f4\u7ebf\u3001\u5b89\u5168\u68c0\u67e5\u6e05\u5355\u3001\u767b\u5f55\u63d0\u9192","exists":true,"mtime":"2026-09-28 04:57:55","path":"routes/account_security_routes.py","sha256":"a2fc4f441c3bd82a0fe1a03fa3cbb56c974c654e886557acdf99a4572bfbee6b","size":8673},{"desc":"\u9690\u79c1\u4fee\u6539\u5feb\u7167\uff1a5 \u5929\u5185\u53ef\u4e00\u952e\u8fd8\u539f\uff08\u975e\u672c\u4eba\u64cd\u4f5c\u53ef\u56de\u6eda\uff09","exists":true,"mtime":"2026-09-13 02:18:55","path":"routes/privacy_snapshot_routes.py","sha256":"51a4ae305a7e94c53473130886d2c4787cd3693b8b918ed2f8a6a095508fffa6","size":13909},{"desc":"\u8d26\u53f7\u6ce8\u9500\uff1a7 \u5929\u51b7\u9759\u671f\u4e0e\u5f7b\u5e95\u5220\u9664","exists":true,"mtime":"2026-09-13 02:18:55","path":"routes/account_deletion_routes.py","sha256":"6ffe4e1a1c1e0e40755eff36c8b052152c8806288b9f566cab1b522a6dc6b90e","size":16315},{"desc":"\u5f02\u5730/\u65b0\u8bbe\u5907\u98ce\u9669\u767b\u5f55\u4e8c\u6b21\u6821\u9a8c","exists":true,"mtime":"2026-09-13 02:18:55","path":"routes/risk_login_routes.py","sha256":"5765f4232853af107fd54dc297a20081bb6e4ff0d5a9a769c71904ed80893c87","size":19666},{"desc":"\u626b\u7801\u767b\u5f55\uff1a\u4e00\u6b21\u6027\u4ee4\u724c\u4e0e\u8bbe\u5907\u7ed1\u5b9a","exists":true,"mtime":"2026-09-25 00:24:31","path":"routes/qr_login_routes.py","sha256":"de1ecb245309ded4f8cb1ff115db252b23d61f38fe3e1e90d94c057881c14835","size":15192},{"desc":"\u8bbe\u5907\u5bc6\u94a5\uff1a\u660e\u6587\u53ea\u51fa\u73b0\u4e00\u6b21\uff0c\u5e93\u5185\u53ea\u5b58 SHA-256","exists":true,"mtime":"2026-09-13 02:18:55","path":"routes/device_key_routes.py","sha256":"76eeb97ff03ef66912d8577b25095fb4700125a950bdf894354a63f7c583987e","size":6803},{"desc":"\u7528\u91cf\u7edf\u8ba1\u9875\uff1a\u8f6c\u4e49\u4e0e\u9274\u6743\uff08\u539f SSTI \u4fee\u590d\u70b9\uff09","exists":true,"mtime":"2026-09-25 13:59:15","path":"routes/usage_routes.py","sha256":"a6ca7ab90490885da1b86614bb4a57f30dc76b4ac678a49b725b75975846e316","size":18344},{"desc":"\u7ba1\u7406\u63a5\u53e3\u9274\u6743\u4e0e\u516c\u5f00\u6700\u5c0f\u5316\u63a5\u53e3\u62c6\u5206","exists":true,"mtime":"2026-10-17 02:54:53","path":"routes/store_admin_routes.py","sha256":"f55c1dcf3dda607af2a34339a45905b1af7d54e1ddc6a37b175f4e426426e5f2","size":45295},{"desc":"APP \u4fa7\u5b89\u5168\u5c42\uff1abcrypt\u3001TOTP\u3001\u6062\u590d\u7801\u3001\u4ee4\u724c\u54c8\u5e0c","exists":true,"mtime":"2026-09-25 00:12:01","path":"app_api/security.py","sha256":"66d0f068026e35e60832188da3620a2f5562d459d824078a923fbd4f4c187afb","size":7051},{"desc":"\u95e8\u6237\u5230\u804a\u5929\u5b50\u5e94\u7528\u7684\u4e00\u6b21\u6027\u63e1\u624b\u4ee4\u724c","exists":true,"mtime":"2026-09-13 02:18:55","path":"handshake_token.py","sha256":"6e91362228a3d70359d026994d1b2ab6fa8b1f52645f91e77e6b9877866887b5","size":9318},{"desc":"\u6ce8\u9500\u72b6\u6001\u673a\u4e0e\u5230\u671f\u6e05\u7406","exists":true,"mtime":"2026-09-13 02:18:55","path":"account_deletion_service.py","sha256":"f9f9a4ca71e733d818eb25e4a6287d46483f29db059680035f94d44298af7def","size":11668}],"generated_at":"2026-11-08 16:04:57","hardening_changelog":[{"date":"2026-08-28","note":"\u9996\u6b21\u672c\u5730\u5b89\u5168\u5ba1\u8ba1\uff0c\u786e\u8ba4 4 \u4e2a\u9ad8\u4f18\u5148\u7ea7\u95ee\u9898"},{"date":"2026-09-28","note":"\u590d\u5ba1\u8ba1\uff1a\u6ce8\u5165\u3001\u672a\u6388\u6743\u7528\u91cf\u6cc4\u9732\u3001DOM XSS\u3001\u4f2a\u9020\u8f6c\u53d1\u5934\u5168\u90e8\u4fee\u590d\u5e76\u590d\u9a8c"},{"date":"2026-09-27","note":"\u670d\u52a1\u5668\u4fa7\u5bc6\u94a5\u6743\u9650\u52a0\u56fa\u4e0e\u52a0\u5bc6\u5907\u4efd\uff08\u76ee\u5f55/\u6587\u4ef6\u6743\u9650\u3001\u52a0\u5bc6\u5f52\u6863\uff09"}],"is_https":true,"notes":["\u672c\u63a5\u53e3\u53ea\u8fd4\u56de\u8bc1\u4e66\u516c\u94a5\u4fe1\u606f\u3001\u54cd\u5e94\u5934\u4e0e\u6e90\u7801\u6587\u4ef6\u54c8\u5e0c\uff0c\u4e0d\u8fd4\u56de\u4efb\u4f55\u7528\u6237\u6570\u636e\u3002","\u54c8\u5e0c\u4e00\u81f4\u53ea\u80fd\u8bc1\u660e\u300c\u8fd9\u4efd\u6587\u4ef6\u4e0e\u7559\u6863\u526f\u672c\u9010\u5b57\u8282\u76f8\u540c\u300d\uff0c\u4e0d\u7b49\u4e8e\u4ee3\u7801\u672c\u8eab\u6ca1\u6709\u7f3a\u9677\u3002","\u670d\u52a1\u5668\u79c1\u94a5\uff08privkey.pem\uff09\u4ece\u672a\u5bfc\u51fa\u5230\u672c\u673a\uff0c\u672c\u63a5\u53e3\u4e5f\u4e0d\u8bfb\u53d6\u5b83\u3002"],"ok":true,"safety_nets":[{"item":"bcrypt\uff08cost=12\uff09+ \u6bcf\u7528\u6237\u72ec\u7acb\u76d0","where":"app.py \u7684 hash_password / verify_password\uff1bbcrypt \u7f3a\u5931\u65f6\u76f4\u63a5\u62a5\u9519\uff0c\u4e0d\u964d\u7ea7\u4e3a\u65e0\u76d0 SHA-256"},{"item":"\u65e7\u54c8\u5e0c\u767b\u5f55\u5373\u65f6\u5347\u7ea7","where":"\u5386\u53f2\u65e0\u76d0 SHA-256 \u4ec5\u5728\u767b\u5f55\u6210\u529f\u90a3\u4e00\u523b\u6821\u9a8c\u4e00\u6b21\uff0c\u968f\u540e\u5c31\u5730\u6539\u5199\u4e3a bcrypt"},{"item":"\u6539\u5bc6\u5373\u8e22\u6389\u5176\u5b83\u4f1a\u8bdd","where":"users.password_version \u9012\u589e\uff0c\u65e7\u4f1a\u8bdd\u7248\u672c\u53f7\u4e0d\u5339\u914d\u7acb\u5373\u5f3a\u5236\u91cd\u65b0\u767b\u5f55"},{"item":"TOTP \u4e24\u6b65\u9a8c\u8bc1\uff08RFC 6238\uff09","where":"6 \u4f4d\u52a8\u6001\u7801\u300130 \u79d2\u5468\u671f\u3001\u524d\u540e\u5404\u5bb9\u5fcd 1 \u4e2a\u5468\u671f\uff1b\u5bc6\u94a5 20 \u5b57\u8282\u968f\u673a"},{"item":"\u6062\u590d\u7801\u53ea\u5b58\u54c8\u5e0c","where":"sha256(\"tianyi-recovery:\" + \u53bb\u6a2a\u6760\u5927\u5199)\uff0c\u660e\u6587\u4e0d\u843d\u5e93"},{"item":"\u8bbe\u5907\u5bc6\u94a5\u4e0e\u767b\u5f55\u4ee4\u724c\u53ea\u5b58\u54c8\u5e0c","where":"tk_ / at_ \u660e\u6587\u4ec5\u751f\u6210\u65f6\u8fd4\u56de\u4e00\u6b21\uff0c\u5e93\u5185\u53ea\u6709 SHA-256"},{"item":"\u767b\u5f55\u5931\u8d25\u4e34\u65f6\u5c01\u7981","where":"5 \u5206\u949f\u7a97\u53e3\u5185\u540c\u4e00 IP \u226510 \u6b21\u6216\u540c\u4e00\u8d26\u53f7 \u22655 \u6b21\u5931\u8d25 \u2192 \u4e34\u65f6\u5c01\u7981 15 \u5206\u949f"},{"item":"\u65b0\u8bbe\u5907/\u5f02\u5730\u767b\u5f55\u4e8c\u6b21\u6821\u9a8c","where":"\u6309\u300cUA+\u8bed\u8a00+\u5e73\u53f0+\u673a\u578b\u300d\u7b97\u8bbe\u5907\u6307\u7eb9\uff08\u4e0d\u542b IP \u504f\u79fb\uff09\uff0c\u547d\u4e2d\u98ce\u9669\u5219\u8981\u6c42\u52a8\u6001\u7801/\u6062\u590d\u7801"},{"item":"\u9690\u79c1\u4fee\u6539\u5feb\u7167\u4e0e\u4e00\u952e\u56de\u6eda","where":"\u6539\u5bc6\u3001\u6539\u90ae\u7bb1\u3001\u6362 TOTP \u7b49\u64cd\u4f5c\u5148\u5b58\u4fee\u6539\u524d\u72b6\u6001\uff0c5 \u5929\u5185\u975e\u672c\u4eba\u64cd\u4f5c\u53ef\u6821\u9a8c\u540e\u8fd8\u539f"},{"item":"\u6ce8\u9500\u51b7\u9759\u671f\u4e0e\u5f7b\u5e95\u5220\u9664","where":"\u6ce8\u9500\u7533\u8bf7\u540e 7 \u5929\u51b7\u9759\u671f\uff0c\u671f\u95f4\u53ef\u64a4\u56de\uff1b\u5230\u671f\u5f7b\u5e95\u5220\u9664\u8d26\u53f7\u6570\u636e"},{"item":"\u5f52\u6863\u5185\u5bb9\u7aef\u5230\u7aef\u52a0\u5bc6","where":"AES-256-GCM\uff0c\u5bc6\u94a5\u7531\u7528\u6237\u81ea\u8bbe\u7684\u5f52\u6863\u5bc6\u7801\u6d3e\u751f\uff0c\u670d\u52a1\u7aef\u53ea\u5b58\u5bc6\u6587"},{"item":"\u54cd\u5e94\u4fa7\u5b89\u5168\u5934","where":"CSP\uff08\u5df2\u79fb\u9664 unsafe-eval\uff09\u3001X-Frame-Options: DENY\u3001nosniff\u3001Referrer-Policy\u3001Permissions-Policy"}],"security_headers":[{"name":"Content-Security-Policy","present":true,"value":"default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com https://cdn.jsdelivr.net; img-src 'self' data: blob: https:; media-src 'self' data: blob:; worker-src 'self' blob:; connect-src 'self' https://api.open-meteo.com https://air-quality-api.open-meteo.com https://api.bigdatacloud.net https://api-bdc.io https://ipapi.co https://weather.tianyihome.top https://weather.tianyiapi.top https://status.yizhihuafenya.com; "},{"name":"X-Frame-Options","present":true,"value":"SAMEORIGIN"},{"name":"X-Content-Type-Options","present":true,"value":"nosniff"},{"name":"X-XSS-Protection","present":true,"value":"1; mode=block"},{"name":"Referrer-Policy","present":true,"value":"strict-origin-when-cross-origin"},{"name":"Permissions-Policy","present":true,"value":"camera=(self), microphone=(self), geolocation=(self), payment=(), usb=(), serial=(), midi=(), display-capture=()"},{"name":"Strict-Transport-Security","present":true,"value":"max-age=31536000; includeSubDomains"},{"name":"Server","present":true,"value":"TianyiHome/1.0"}],"security_headers_kind":"\u672c\u673a\u6309 app.py \u7684 after_request \u89c4\u5219\u63a8\u7b97\uff08\u53ef\u7528\u5f00\u53d1\u8005\u5de5\u5177\u6838\u5bf9\uff09","site":"tianyihome.top","tls":{"ct_search_url":"https://crt.sh/?q=tianyihome.top","domain":"tianyihome.top","fingerprint_match":null,"live":{"checked_at":"2026-11-08 16:04:57","cipher":"TLS_AES_256_GCM_SHA384","der_sha256":"f02b127991e9240fbe269656e113b5c2e6d1bda3270ee2e955dd9fe98bbdd3b5","error":"","fingerprint_sha256":"F0:2B:12:79:91:E9:24:0F:BE:26:96:56:E1:13:B5:C2:E6:D1:BD:A3:27:0E:E2:E9:55:DD:9F:E9:8B:BD:D3:B5","ok":true,"tls_version":"TLSv1.3"},"local_archive":{"available":false,"domain":"tianyihome.top","files":[],"reason":"\u672c\u5730\u672a\u627e\u5230 ssl/tianyihome.top/cert.pem \u7559\u6863\u526f\u672c"}}}
