公司动态
影刀RPA 流程合规检查清单:上线前的安全检查项
影刀RPA 流程合规检查清单上线前的安全检查项作者林焱什么情况用写完一个流程迫不及待想上线跑——但你真的确认它安全吗我见过太多这样的场景流程在开发机上跑得好好的上线第二天就出事了——不小心把生产数据库的订单表删了、批量发邮件时抄送了不该抄送的人、流程卡在一个弹窗上等了6小时直到超时。流程上线和代码上线一样需要走一遍安全检查清单。核心场景流程开发完成准备上线运行前逐一检查安全性、稳定性和合规性。怎么做第一步安全检查清单按这个顺序逐项打勾别跳□ 1. 凭证明文检查 □ 2. 文件路径检查 □ 3. 网络请求检查 □ 4. 异常处理检查 □ 5. 数据安全与隐私检查 □ 6. 资源消耗检查 □ 7. 流程中止条件检查 □ 8. 日志与监控检查 □ 9. 版本与备份检查 □ 10. 灰度测试确认第二步逐项详解1. 凭证明文检查# ❌ 上线前必须清理的代码API_KEYsk-abc123xyz456DB_PASSWORDMyPssw0rd!email_passwordapp_pass_123# ✅ 正确做法[video(video-8mL3e7it-1784481802357)(type-csdn)(url-https://live.csdn.net/v/embed/526818)(image-https://v-blog.csdnimg.cn/asset/582d14c3bd0451c5399cd990b56e2a0d/cover/Cover0.jpg)(title-拼多多店群自动化报活动上架)]importos API_KEYos.environ.get(RPA_API_KEY)# 或从凭证管理器获取检查方法在代码里搜索password、secret、token、key、api确认没有硬编码的凭证。2. 文件路径检查# ❌ 绝对路径换机器就跑不了file_pathC:/Users/Administrator/Desktop/data.csv# ✅ 使用相对路径或配置化路径file_pathos.path.join(RPA_DATA_DIR,data.csv)# ❌ 硬编码的系统临时目录temp_dirC:/Windows/Temp# ✅ 用系统API获取importtempfile temp_dirtempfile.gettempdir()关键检查点输入文件路径是否正确测试数据可能和生产数据不在同一位置输出文件路径是否会在生产环境产生权限问题文件名是否包含时间戳防止覆盖历史结果3. 网络请求检查# ❌ 没有超时的请求resprequests.get(https://api.example.com/data)# ✅ 必须设置超时resprequests.get(https://api.example.com/data,timeout30)# ❌ 没有重试机制# ✅ 至少要处理网络异常try:resprequests.post(url,jsondata,timeout30)resp.raise_for_status()exceptrequests.exceptions.Timeout:print(f请求超时{url})# 记录到失败队列exceptrequests.exceptions.RequestExceptionase:print(f请求失败{e})检查清单所有网络请求设置了timeout关键请求有重试逻辑处理了可能的网络异常频率限制QPS不会超过服务端限制4. 异常处理检查# ❌ 裸奔的代码——出错了流程直接挂dataget_data_from_web()process_data(data)save_to_database(data)# ✅ 必须要有异常处理try:dataget_data_from_web()ifnotdata:raiseValueError(获取数据为空)try:resultprocess_data(data)exceptExceptionase:# 处理逻辑出错时原始数据别丢backup_raw_data(data,ffailed_{timestamp}.json)raisesave_to_database(result)exceptExceptionase:# 至少通知运维send_alert(f流程异常{e})# 记录详细日志log_error(e,traceback.format_exc())5. 数据安全与隐私检查□ 导出的CSV/Excel中是否包含未经脱敏的个人信息 □ 日志文件是否会打印完整手机号/身份证号 □ 截图是否可能包含敏感信息 □ 邮件收件人列表是否正确别把测试列表带到生产 □ 数据库操作是否有限制条件别忘记WHERE子句特别注意DELETE和UPDATE操作# ❌ 极其危险——没有WHERE条件cursor.execute(DELETE FROM orders)# ✅ 必须有限制条件且限制条件来自明确的变量cursor.execute(DELETE FROM orders WHERE statuscancelled AND created_at ?,(threshold_date,))# ✅ 危险操作前先SELECT确认影响范围cursor.execute(SELECT COUNT(*) FROM orders WHERE statuscancelled)countcursor.fetchone()[0]print(f将删除{count}条记录确认后执行)6. 资源消耗检查□ 内存使用大文件是否分块处理而不是一次性加载 □ 磁盘空间输出文件是否会无限增长 □ CPU占用是否有死循环 □ 数据库连接是否用完就关闭不是等垃圾回收 □ 临时文件是否及时清理# ❌ 一次性加载大文件到内存dfpd.read_csv(huge_file.csv)# 2GB的CSV直接爆内存# ✅ 分块处理chunk_size10000forchunkinpd.read_csv(huge_file.csv,chunksizechunk_size):process(chunk)# 每次只处理10000行7. 流程中止条件检查□ 是否有可能无限循环while True必须有明确的退出条件 □ 是否有超时机制整个流程最长跑多久 □ 是否有手动中止的退出点  □ 是否有条件分支处理了「数据为空」的情况8. 日志与监控检查□ 运行是否记录了日志时间、输入、输出、错误 □ 失败时是否有人收到通知企微/钉钉/邮件 □ 是否方便事后排查问题日志里有足够的上下文 □ 日志文件是否会无限增长是否设置了轮转或定期清理9. 版本与备份检查□ 是否保存了上一个能正常运行的版本 □ 本次修改是否有变更记录改了哪里、为什么改 □ 能否一键回滚到上一个版本 □ 输入数据是否有备份处理失败能重新来10. 灰度测试确认在上全量之前先小规模验证# 灰度测试模式TEST_MODETrue# 上线前改为FalseTEST_LIMIT10# 只处理前10条defprocess_items(items):ifTEST_MODE:itemsitems[:TEST_LIMIT]print(f灰度模式只处理前{TEST_LIMIT}条)foriteminitems:process(item)ifTEST_MODE:print(灰度测试完成确认结果无误后再关闭TEST_MODE)第三步快速自查脚本写一个脚本自动扫描代码importosimportreclassSecurityScanner:流程安全检查扫描器# 危险模式DANGER_PATTERNS[(r(password|passwd|pwd|secret|token|api_key)\s*\s*[\][^\][\],硬编码凭证),(rDELETE\sFROM\s\w\s*$,危险的DELETE语句缺少WHERE条件),(rUPDATE\s\w\sSET\s.*\s*$,危险的UPDATE语句可能缺少WHERE条件),(rrequests\.(get|post|put|delete)\([^)]*\)(?!.*timeout),网络请求缺少timeout参数),(rwhile\sTrue,无限循环检查是否有退出条件),]classmethoddefscan_file(cls,filepath):扫描单个文件ifnotfilepath.endswith((.py,.txt,.md)):return[]issues[]withopen(filepath,r,encodingutf-8)asf:contentf.read()forpattern,descriptionincls.DANGER_PATTERNS:matchesre.finditer(pattern,content,re.IGNORECASE)forminmatches:# 计算行号line_numcontent[:m.start()].count(\n)1issues.append({file:filepath,line:line_num,issue:description,snippet:m.group()[:80]})returnissuesclassmethoddefscan_folder(cls,folder_path):扫描整个文件夹all_issues[]forroot,dirs,filesinos.walk(folder_path):forfinfiles:filepathos.path.join(root,f)issuescls.scan_file(filepath)all_issues.extend(issues)# 生成报告print(f\n 安全检查报告 )print(f扫描文件数扫描完成)print(f发现问题{len(all_issues)}个\n)forissueinall_issues:print(f[{issue[issue]}])print(f 位置{issue[file]}:{issue[line]})print(f 代码{issue[snippet]})print()returnall_issues# 使用# SecurityScanner.scan_folder(./my_rpa_scripts)有什么坑TEMU店群矩阵自动化运营核价报活动坑1自以为简单的流程不需要检查「就是个数据导出工具哪会出问题」——然后导出了生产数据库的全部客户信息发到了一个外网邮箱。原则所有上线流程都要走一遍清单哪怕是「只读不写」的流程也有隐私风险。坑2测试环境和生产环境混用测试时连接的是测试数据库上线时忘记改配置——流程连上了生产库用测试逻辑去处理生产数据。解决方法环境配置独立管理测试和生产用不同的配置文件、不同的凭证、不同的输出目录。坑3安全检查只在首次上线时做流程迭代改了几个地方觉得改动小不用再检查——然后一个新增的API调用没加timeout半夜超时把整个流程卡死了。解决方法每次修改流程后至少检查修改涉及的部分。重大版本更新走完整清单。坑4忽视操作系统的权限问题在管理员权限下开发流程流程可以随便读写文件。上线后用普通用户跑结果Permission denied。解决方法在和生产环境相同权限的账号下做最终测试。坑5流程回滚的代价被低估没有保留上一个版本新版本出问题只能临时修——修的过程中业务就断了。解决方法流程文件用Git管理每个版本打tag。出问题git checkout v1.2.3就能切回去。总结上线前的安全检查不是形式主义是无数踩坑经验的总结。走完这个清单能挡住90%的生产事故。剩下的10%靠日志和监控及时发现问题。