IHP 框架安全指南:XSS、SQL 注入、CSRF 与认证安全的自动化防护与手动加固
后端【免费下载链接】ihp The fastest way to build type safe web apps. IHP is a new batteries-included web framework optimized for longterm productivity and programmer happiness项目地址https://gitcode.com/gh_mirrors/ih/ihp点击查看免费下载本指南系统讲解 IHPIntegrated Haskell Platform内置的安全防护机制HSX 模板自动转义、QueryBuilder 参数化查询、SameSiteLax会话 Cookie 策略、PBKDF1 密码哈希与登录锁定、批量赋值防护以及文件上传安全。读完本文你将掌握 IHP 开箱即用的安全能力边界并学会在Config/Config.hs与控制器中完成 HTTPS、安全响应头、CSP、会话生命周期等手动加固配置。Overview框架自动防护与开发者责任的边界IHP 在框架层面自动处理了多数常见 Web 漏洞——跨站脚本XSS、SQL 注入、跨站请求伪造CSRF均无需开发者额外编码。其设计哲学是默认安全secure by default即把最容易出错的防护动作转义、参数化、Cookie 策略内置到基础设施中让开发者难以写出不安全代码。但自动化防护并非万能。本文同时明确划出你需要自己负责的部分原始 HTML 输出preEscapedToHtml属于显式逃生舱一旦使用即自行承担 XSS 风险原始 SQLsqlQuery/sqlExec/typedSql必须遵循参数占位符规范状态变更请求必须使用 POST/DELETE 等非 GET 方法文件上传的类型校验与大小限制、安全响应头、HTTPS 终止均需手动配置。下文逐一展开。跨站脚本XSS防护XSS 是攻击者向其他用户浏览的页面注入恶意脚本的漏洞。如果用户输入被当作原始 HTML 渲染攻击者注入的 JavaScript 可能窃取会话 Cookie、重定向用户或篡改页面内容。HSX 的自动转义机制IHP 的 HSX 模板系统会自动转义所有插值内容。当你写出[hsx|div{userInput}/div|]userInput中的任何 HTML 特殊字符在渲染前都会被转义。例如若userInput包含scriptalert(xss)/scriptHSX 会将其渲染为字面文本lt;scriptgt;alert(xss)lt;/scriptgt;——浏览器把它当作普通文本显示而不会作为代码执行。该机制适用于所有插值进 HSX 的数据类型包括Text、String、Int以及任何具有Show实例的类型。属性值同样被转义[hsx|a href{userProvidedUrl}Link/a|]从源码层面看ihp-hsx/direct/IHP/HSX/Markup.hs 中定义了底层转义原语htmlEscapedW8它通过BP.condB分支精确处理四个 ASCII 特殊字符→amp;、→lt;、→gt;、→quot;多字节 UTF-8 引导字节原样透传。所有ToHtml实例Text、String、ByteString、Show兜底实例以及AttributeValue实例在输出前都会经过encodeUtf8BuilderEscaped htmlEscapedW8完成转义实现零中间树的高性能输出。这套行为与 Blaze 的转义语义保持一致并已由 ihp-hsx/Test/IHP/HSX/QQSpec.hs 等测试用例验证。何时会绕过转义如果需要渲染原始 HTML例如由 Markdown 生成的 HTML可以使用preEscapedToHtml[hsx|div{markdownHtml | preEscapedToHtml}/div|]这会绕过 XSS 防护。只能对你自己生成或已净化过的内容使用preEscapedToHtml绝不要用于用户输入-- 危险用户输入被当作原始 HTML 渲染 [hsx|div{param comment | preEscapedToHtml}/div|] -- 安全让 HSX 自动转义输入 [hsx|div{param comment}/div|]类似的preEscapedTextValue会绕过属性值的转义需谨慎使用。查看 ihp-hsx/direct/IHP/HSX/Markup.hs 可以看到这两个函数的实现它们直接使用TE.encodeUtf8Builder原样输出字节流不做任何转义处理——这正是它们危险的本质来源。SQL 注入防护SQL 注入是攻击者通过在用户输入中插入恶意 SQL 来操纵数据库查询的漏洞。例如用户可能在表单字段中输入; DROP TABLE users; --如果输入被直接拼接到 SQL 字符串中数据库就会执行注入的命令。QueryBuilder 的参数化查询IHP 的 QueryBuilder 始终使用参数化查询。用户输入作为独立参数发送给 PostgreSQL绝不插值进 SQL 字符串-- 安全email 作为参数发送而不是拼接进 SQL query User | filterWhere (#email, userProvidedEmail) | fetchOneOrNothingQueryBuilder 的所有函数——filterWhere、filterWhereIn、filterWhereLike等——都使用参数化查询。使用 QueryBuilder 时你无需做任何特殊处理即可获得 SQL 注入防护。从实现上看ihp/IHP/QueryBuilder/HasqlCompiler.hs 通过一个参数计数器 编码器累加器的CompilerState贯穿编译过程nextParam为每个值分配$N占位符并把对应编码器追加到参数列表最终通过Hasql.preparable sql encoder decoder构造可预编译的 HasqlStatement。条件值由 ihp/IHP/QueryBuilder/Types.hs 中的ConditionValue区分Param携带参数化编码器编译器为其分配$NLiteral则直接输出 SQL 片段。这意味着哪怕是filterWhere、filterWhereLike、filterWhereIn等各类操作符见 HasqlCompiler.hs 中LIKE/ILIKE/ ANY/ ALL等编译映射用户提供的值也永远走参数通道而非字符串拼接。原始 SQL 查询使用sqlQuery或sqlExec执行原始 SQL 时请用?占位符传参-- 安全使用参数化查询 users - sqlQuery SELECT * FROM users WHERE email ? AND active ? (email, True)绝不能把用户输入直接拼接进 SQL 字符串-- 危险SQL 注入漏洞 users - sqlQuery (SELECT * FROM users WHERE email userInput ) ()typedSql同样使用参数化查询-- 安全参数被安全插值 users - sqlQueryTyped [typedSql| SELECT id, email FROM users WHERE email ${userEmail} |]注意当前仓库对sqlQuery/sqlExec的定位在 ihp/IHP/ModelSupport.hs 中它们被标记为DEPRECATEDDeprecated alias ofunsafeSqlQuery官方推荐优先使用[typedSql| ... |]配合sqlQueryTyped/sqlExecTyped以获得编译期类型检查只有在确需非类型化原始 SQL如动态表名时才使用unsafeSqlQuery系列。无论走哪条路参数都必须通过占位符传递。typedSql的占位符机制在 ihp-typed-sql/IHP/TypedSql/ParamEncoder.hs 中有精确定义${...}内的值被转换为对应的 HasqlSnippet.param编码支持裸列类型${x}、Maybe${Just x}${Nothing}绑定 SQLNULL、列表${[x]}用于IN (...)/ ANY(...)以及可空元素数组。查询参数与列类型的匹配提示由 ParamHints.hs 通过解析 SQL AST 提取。跨站请求伪造CSRFCSRF 是恶意网站诱使受害者浏览器向你的应用发出非预期请求的攻击。例如用户已登录你的应用时恶意站点可以嵌入一个隐藏表单向你的删除账户端点提交 POST 请求。SameSiteLax 会话 Cookie 策略IHP 在会话 Cookie 上使用SameSiteLax属性通知浏览器不要随跨源表单提交POST 请求发送会话 Cookie。由于会话 Cookie 未发送攻击者的请求不会被认证操作随之失败。SameSiteLax允许正常的顶层导航例如从其他网站点击链接进入你的站点但阻止跨源 POST、PUT 和 DELETE 请求携带 Cookie从而覆盖所有常见 CSRF 攻击向量。IHP 不使用 CSRF token——SameSiteCookie 属性提供了等效防护且被所有现代浏览器支持。该策略在 ihp/IHP/FrameworkConfig.hs 的defaultIHPSessionCookie中有直接实现defaultIHPSessionCookie :: Text - Cookie.SetCookie defaultIHPSessionCookie baseUrl def { Cookie.setCookiePath Just / , Cookie.setCookieMaxAge Just (fromIntegral (60 * 60 * 24 * 30)) , Cookie.setCookieSameSite Just Cookie.sameSiteLax , Cookie.setCookieHttpOnly True , Cookie.setCookieSecure https:// Text.isPrefixOf baseUrl }注意Secure标志并非写死而是依据baseUrl是否以https://开头自动决定——这正是HTTPS 与安全头一节中强调IHP_BASEURL必须使用https://的原因。你需要做什么凡是修改数据的操作请使用 POST或 DELETE/PUT/PATCH请求不要用 GET 请求产生副作用-- 正确状态变更使用带 POST 的表单 [hsx| form methodPOST action{DeletePostAction post.id} input typehidden name_method valueDELETE/ button typesubmitDelete/button /form |] -- 错误用普通链接执行破坏性操作 -- GET 请求不受 SameSiteLax 保护 [hsx|a href{DeletePostAction post.id}Delete/a|]js-deleteCSS 类是一个特例——IHP 的 JavaScript 助手会拦截点击通过动态创建的表单提交真正的 DELETE 请求。但对所有其他副作用操作请使用带相应 method 的表单。更多关于表单提交与js-delete助手的细节参见 Forms guide。会话安全会话用于在请求之间持久化少量数据如当前用户 ID。会话的工作方式IHP 将会话数据存放在客户端一个经过加密签名和加密的 Cookie中。加密密钥自动生成存储在Config/client_session_key.aes。内部实现使用 clientsession 的模块文档。由于 Cookie 经过加密与签名用户无法读取或篡改会话数据。setSession/getSession等 API 通过Serialize对值进行编码后存入会话会话 Vault 挂在 WAIRequest的Vault中sessionVaultKey由会话中间件负责加解密往返。会话只适合存放标量值如用户 ID不要存放复杂数据结构。Cookie 安全标志IHP 默认在会话 Cookie 上设置以下安全标志标志值作用HttpOnlyTrueCookie 不可被 JavaScript 访问防止 XSS 攻击窃取会话数据SameSiteLaxCookie 不随跨源 POST 请求发送防止 CSRF 攻击Secure自动当baseUrl以https://开头时为True确保 Cookie 只在加密连接上传输Max-Age30 天会话在 30 天无活动后过期Path/Cookie 对该域名下所有路径可用自定义会话设置可以在Config/Config.hs中定制会话 Cookie-- 将会话生命周期改为 90 天 config :: ConfigBuilder config do option $ SessionCookie (defaultIHPSessionCookie https://yourapp.com) { Cookie.setCookieMaxAge Just (fromIntegral (60 * 60 * 24 * 90)) }defaultIHPSessionCookie的默认值正是上表所列30 天、Lax、HttpOnly、按baseUrl自动设置Secure因此定制时只需在它的基础上覆盖个别字段即可。会话密钥管理在生产环境中会话加密密钥可通过以下方式提供IHP_SESSION_SECRET环境变量密钥值本身IHP_SESSION_SECRET_FILE环境变量指向包含密钥的文件的路径Config/client_session_key.aes文件开发环境默认使用请妥善保管会话密钥。一旦泄露攻击者就能伪造会话 Cookie。认证安全IHP 提供内置的认证模块。安装配置步骤参见 Authentication guide。密码哈希IHP 使用 pwstore-fast 库对密码进行哈希。密码以加盐哈希形式存储采用 PBKDF1 算法强度因子为 17。每个密码都有唯一的随机盐因此相同的密码会产生不同的哈希值。从源码看ihp/IHP/AuthSupport/Authentication.hs 中hashPassword :: Text - IO Text hashPassword plainText cs $ Crypto.PasswordStore.makePassword (cs plainText) passwordStrength验证则通过Crypto.PasswordStore.verifyPassword完成verifyPassword函数封装了该调用。存储密码前请先哈希action CreateUserAction do newRecord User | fill [email, passwordHash] | validateField #passwordHash nonEmpty | ifValid \case Left user - render NewView { .. } Right user - do hashed - hashPassword user.passwordHash user | set #passwordHash hashed | createRecord redirectTo UsersAction账户锁定IHP 提供自动账户锁定以抵御暴力破解攻击。默认情况下连续 10 次登录失败后账户将被锁定一小时。锁定阈值可在SessionsControllerConfig实例中配置instance Sessions.SessionsControllerConfig User where maxFailedLoginAttempts _ 5 -- 改为 5 次后锁定从实现看ihp/IHP/AuthSupport/Controller/Sessions.hs 的createSessionAction中登录失败时对failedLoginAttempts执行incrementField并更新记录当user.failedLoginAttempts maxFailedLoginAttempts user时调用Lockable.lock user锁定账户默认实现为maxFailedLoginAttempts _ 10。登录前还会先检查Lockable.isLocked锁定中的账户会收到 User is locked 错误。这要求你的users表包含locked_at和failed_login_attempts列它们是标准认证 Schema 的一部分。计时安全登录当用户提供不存在的邮箱时IHP 返回与密码错误时相同的通用 Invalid Credentials 错误信息防止攻击者枚举有效邮箱地址。源码中可见查无此用户与密码错误两个分支都执行setErrorMessage Invalid Credentials从行为上无法区分。批量赋值Mass Assignment在一些框架中如 Strong Parameters 之前的 Rails所有表单字段都会自动赋值给模型属性攻击者可以提交isAdmintrue之类的额外字段来提权。IHP 不存在此问题——无论使用fill还是param你都必须显式列出每个字段。使用 fillfill从请求中读取多个字段并与 IHP 的验证系统集成。只有你列出的字段才会被读取action UpdateUserAction { userId } do user - fetch userId user | fill [firstname, lastname, email] | ifValid \case Left user - render EditView { .. } Right user - do user | updateRecord redirectTo ShowUserAction { userId }fill相比手动调用param的优势在于它与表单验证集成——如果字段缺失或无效错误会挂到记录上并显示在表单字段旁。直接使用param也可以但验证需要自己处理。文件上传安全IHP 支持上传文件到本地存储和 S3 兼容云存储。详细用法参见 File Storage guide。IHP 已做的事唯一文件路径上传文件以 UUID 路径存储如/uploads/users/550e8400-.../picture.jpg避免文件名冲突与路径遍历攻击。从实现看ihp/IHP/FileStorage/ControllerFunctions.hs 中storeFileWithOptions通过UUID.nextRandom生成随机 UUID 作为文件名拼出options.directory / UUID.toText fileName的对象路径。云存储使用 S3 存储时上传文件存放在 Web 服务器文档根目录之外访问通过带可配置过期时间的签名 URL 控制。你需要做的事校验文件类型IHP 不会自动校验文件内容类型。如果应用只接受图片请在存储前检查内容类型action UploadAction do case fileOrNothing avatar of Just fileInfo | fileInfo.fileContentType elem [image/jpeg, image/png] - storeFile fileInfo avatars | otherwise - do setErrorMessage Only JPEG and PNG files are allowed redirectTo UploadFormAction Nothing - do setErrorMessage No file selected redirectTo UploadFormAction限制上传大小在Config/Config.hs中配置最大请求体大小防止超大上传造成拒绝服务import qualified Network.Wai.Parse as WaiParse config :: ConfigBuilder config do option $ WaiParse.setMaxRequestFileSize (10 * 1024 * 1024) -- 10 MB WaiParse.defaultParseRequestBodyOptions安全地提供上传文件使用本地存储时上传文件存放在static/目录并由 Web 服务器直接提供。生产环境建议改用云存储S3以便通过签名的限时 URL 控制文件访问。环境变量与密钥密钥存储绝不要在源代码中硬编码密钥数据库凭据、API 密钥、加密密钥应使用环境变量-- 在控制器或配置中 import IHP.EnvVar action SendEmailAction do apiKey - env Text SENDGRID_API_KEY -- 使用 apiKey...env的语义见 ihp/IHP/EnvVar.hs读取环境变量并按返回值类型解析Text、Int等可自定义EnvVarReader实例变量缺失或解析失败时中止应用启动。需要默认值时用envOrDefault允许缺失时用envOrNothing。常用环境变量变量用途DATABASE_URLPostgreSQL 连接字符串IHP_SESSION_SECRET会话加密密钥PORTHTTP 服务器端口IHP_BASEURL应用的 Base URL如https://yourapp.comIHP_ENV环境Development或Production其中IHP_BASEURL会被 ihp/IHP/FrameworkConfig.hs 直接读取并转化为BaseUrl配置随后用于构建会话 Cookie 并决定Secure标志——这是生产环境务必设置https://前缀的直接原因。部署生产环境中通过托管商的控制面板、.env文件不要提交到版本控制或密钥管理器设置环境变量。更多细节参见 Config guide 与 Deployment guide。HTTPS 与安全响应头HTTPSIHP 自身不终止 TLS。生产环境中应让 IHP 运行在负责 TLS 终止的反向代理如 nginx 或 Caddy或负载均衡器之后。当baseUrl通过IHP_BASEURL或Config/Config.hs设置以https://开头时IHP 自动给会话 Cookie 设置Secure标志确保它们只在加密连接上传输。确保生产环境的IHP_BASEURL使用https://export IHP_BASEURLhttps://yourapp.com安全响应头IHP 默认不设置Strict-Transport-Security、X-Content-Type-Options、X-Frame-Options等安全头。你可以在Config/Config.hs中通过自定义中间件添加import Network.Wai (ifRequest, modifyResponse, mapResponseHeaders) config :: ConfigBuilder config do option $ CustomMiddleware securityHeadersMiddleware securityHeadersMiddleware :: Middleware securityHeadersMiddleware application request respond application request $ respond . addHeaders where addHeaders response mapResponseHeaders ( securityHeaders) response securityHeaders [ (Strict-Transport-Security, max-age31536000; includeSubDomains) , (X-Content-Type-Options, nosniff) , (X-Frame-Options, DENY) , (Referrer-Policy, strict-origin-when-cross-origin) ]如果你的反向代理nginx、Caddy 等已经添加了这些头就不需要在 IHP 中重复添加。内容安全策略CSPCSP 告知浏览器页面允许加载哪些来源的内容脚本、样式、图片等为 XSS 提供额外一层纵深防御。IHP 默认不设置 CSP 头。可以用上述自定义中间件的方式添加securityHeaders [ (Content-Security-Policy, default-src self; script-src self; style-src self unsafe-inline) -- ... 其他响应头 ]根据应用需求调整策略。如果使用内联脚本、外部 CDN 或第三方服务需要在相应指令中加入它们的域名。完整参考见 MDN CSP 文档。安全清单用以下清单审视应用的安全态势生产环境使用 HTTPS——将IHP_BASEURL设为https://URL使会话 Cookie 标记为Secure密钥不进入源代码——API 密钥、数据库凭据与会话密钥存放在环境变量中而非提交的文件里用fill白名单化表单字段——绝不手动把用户输入赋给敏感记录字段不要对用户输入使用preEscapedToHtml——只对你自己生成或净化过的内容使用原始 SQL 使用参数化查询——sqlQuery/sqlExec始终用?占位符绝不字符串拼接校验文件上传——检查内容类型并设置上传大小限制状态变更用 POST——不要用 GET 请求执行创建、更新或删除数据的操作添加安全响应头——通过中间件或反向代理配置Strict-Transport-Security、X-Content-Type-Options、X-Frame-Options保持依赖更新——定期运行nix flake update获取安全补丁使用授权检查——用ensureIsUser、accessDeniedUnless和行级安全策略控制资源访问上述授权与行级安全的具体用法可进一步参阅 Authorization guide密码哈希、登录锁定等认证细节见 Authentication guide。遵循本清单结合 IHP 内置的自动化防护即可构建出默认安全、纵深防御的生产级应用。赞分享后端【免费下载链接】ihp The fastest way to build type safe web apps. IHP is a new batteries-included web framework optimized for longterm productivity and programmer happiness项目地址https://gitcode.com/gh_mirrors/ih/ihp点击查看免费下载相关推荐next-learn安全防护XSS、CSRF、SQL注入防护指南next learn安全防护XSS、CSRF、SQL注入防护指南 还在为Web应用安全担忧本文为你提供next learn项目的全方位安全防护方案涵盖XS示例工程OpCore-Simplify30分钟搞定黑苹果配置的终极自动化工具OpCore Simplify30分钟搞定黑苹果配置的终极自动化工具 还在为黑苹果复杂的OpenCore配置而头疼吗OpCore Simplify是一款革命开发工具CLIApache Answer安全防护策略XSS、CSRF与SQL注入防护Apache Answer安全防护策略XSS、CSRF与SQL注入防护 Apache Answer是一个现代化的问答平台提供了全面的安全防护机制来保护用户数后端上一篇《动手学深度学习》深度学习计算章节导读从基础用户到高级用户的六个关键能力下一篇CyberStrike方法论引擎源码剖析13阶段渗透跟踪、前置门禁与违规检测是如何实现的创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

TensorSpace 模型预处理实战:将单一输出预训练模型转换为层间多输出可视化格式

TensorSpace 模型预处理实战:将单一输出预训练模型转换为层间多输出可视化格式

数据可视化深度学习3D渲染AI 可解释性 【免费下载链接】tensorspace Neural network 3D visualization framework, build interactive and intuitive model in browsers, support pre-trained deep learning models from TensorFlow, Keras, TensorFlow.js 项目地址&#xff1…

2026/10/13 3:12:46 阅读更多 →
GESP图形化编程三级解析

GESP图形化编程三级解析

解析:答案:A解析:答案:B解析:程序从上往下执行答案:D解析:考察双重循环答案:A解析:答案:B解析:克隆体拥有和本体一样的功能,本体可以干…

2026/10/13 3:12:46 阅读更多 →
Nacos作为服务配置中心实战

Nacos作为服务配置中心实战

目录 1、Nacos作为配置中心-基础配置 1.1 新建cloudalibaba-config-nacos-client3377模块 1.2 pom.xml 1.2 YML文件 1.2.1 为什么配置要配置两个yml文件 1.2.2 bootstrap.yml 1.2.3 application.yml 1.3 主启动类 1.4 业务类 1.5 在Nacos中添加配置信息 1.6 测试 2…

2026/10/13 3:11:46 阅读更多 →

最新新闻

darknet运行报错libopencv_highgui.so.3.2缺失?动态库排查与解决全攻略

darknet运行报错libopencv_highgui.so.3.2缺失?动态库排查与解决全攻略

直接跑./darknet就报错error while loading shared libraries: libopencv_highgui.so.3.2,这种动态库缺失的问题,估计每个搞深度学习目标检测的人都被它堵过一阵子。明明编译都过了,运行却翻车,查了半天也不知道到底哪里没对上。如…

2026/10/13 4:02:58 阅读更多 →
AnyPS5:面向PS5主机的本地化系统工具链设计与实现

AnyPS5:面向PS5主机的本地化系统工具链设计与实现

项目标题本身“AnyPS5”未提供足够上下文,但结合命名惯例、技术社区常见实践及合规安全边界,可明确判断:这是一个面向 PlayStation 5 主机的本地化工具类项目代号,聚焦于主机端系统级功能增强、本地环境适配或用户侧体验优化&…

2026/10/13 4:02:58 阅读更多 →
并查集动态维护连通块大小:‘星球联盟‘题解与易错点

并查集动态维护连通块大小:‘星球联盟‘题解与易错点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 4:02:58 阅读更多 →
AI原生IDE与插件深度对比:Cursor、Trae、通义灵码能力边界与选型指南

AI原生IDE与插件深度对比:Cursor、Trae、通义灵码能力边界与选型指南

这两年AI编程工具的变化速度,快得有点不讲道理。我回想最早用插件式AI补全的时候,代码行预测已经够惊艳了;但现在的AI原生IDE和新一代编程插件,已经把范围从“猜你下一个单词”扩展到了“替你改文件、跑命令、做收尾”。Cursor、T…

2026/10/13 4:02:58 阅读更多 →
GEO优化实战:让DeepSeek、Qwen、豆包、Kimi主动引用你的内容

GEO优化实战:让DeepSeek、Qwen、豆包、Kimi主动引用你的内容

上周我把同一个问题同时丢给 DeepSeek、Qwen、豆包、Kimi,问的是某工业软件厂商的产品优势。四个助手给出的答案里,只有两个提到了这个品牌,引用来源几乎没有交集;其中一个完整转述了官网页面上的一句话,另一个却把品牌…

2026/10/13 4:02:58 阅读更多 →
基于三菱PLC的自动配料控制系统设计:双速给料与落差补偿实战

基于三菱PLC的自动配料控制系统设计:双速给料与落差补偿实战

做自动配料控制系统,绕不开两件事:PLC的选型,和配料流程里那些让人头疼的细节——飞料、秤漂、配方切换、粘度变化导致的给料差异。这个“基于三菱PLC的自动配料控制系统的设计”项目,从需求拆解、硬件选型、控制逻辑到现场调试完…

2026/10/13 4:01:58 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →