您提出了一个很好的问题。确实,目前代码只针对已知的特殊字符(如"●")进行了清理,但在实际使用中,用户可能会输入各种未预见的特殊字符,这可能导致我们需要不断更新代码来处理新的特殊字符。
为了解决这个问题,我建议采用更加通用和健壮的方法来处理用户输入:
- 采用通用的字符清理策略,而不是针对特定字符:
// 更全面的输入清理函数
function sanitizeInput(input) {
// 保留基本的字母、数字、常见标点和中文字符
// 移除或替换可能导致问题的特殊字符
return input
.replace(/[\u0000-\u001F\u007F-\u009F]/g, "") // 移除控制字符
.replace(/[^\p{L}\p{N}\p{P}\p{Z}\p{S}\u4e00-\u9fff]/gu, "") // 只保留字母、数字、标点、空格、符号和中文
.trim();
}
// 然后使用
const sanitizedInput = sanitizeInput(userInput);- 针对特定上下文的转义,特别是在构建JSON或AppleScript时:
// 用于JSON安全的转义
function escapeForJSON(str) {
return JSON.stringify(str).slice(1, -1); // 移除stringify添加的外层引号
}
// 用于AppleScript安全的转义
function escapeForAppleScript(str) {
return str.replace(/"/g, '\\"').replace(/\\/g, '\\\\').replace(/\n/g, '\\n');
}- 加强错误检测和恢复机制:
// 在AppleScript执行前检查内容
function validateEventData(event) {
const requiredFields = ['summary', 'startDate', 'endDate', 'description'];
for (const field of requiredFields) {
if (!event[field] || typeof event[field] !== 'string' || !event[field].trim()) {
throw new Error(`事件缺少必要字段或字段值无效: ${field}`);
}
}
// 验证日期格式
const dateRegex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
if (!dateRegex.test(event.startDate) || !dateRegex.test(event.endDate)) {
throw new Error(`日期格式无效: startDate=${event.startDate}, endDate=${event.endDate}`);
}
}-
使用库处理特殊情况:考虑使用像
sanitize-html或DOMPurify这样的库来处理输入清理,这些库已经覆盖了大多数边缘情况。 -
采用白名单而非黑名单:指定允许的字符,而不是尝试列出所有不允许的字符。
-
处理编码问题:用户输入可能包含各种编码的字符,确保你的应用程序正确处理 UTF-8 和其他编码。
-
错误监控:实现日志记录和错误追踪,以便您可以快速识别并修复新出现的问题。
-
优雅的失败处理:即使在输入无法完全清理的情况下,也应该提供有用的错误消息并优雅地继续执行。
// 更全面的错误处理
try {
// 尝试执行操作
} catch (error) {
console.error("处理用户输入时出错:", error.message);
// 记录错误以便后续分析
// 向用户显示友好的错误消息
// 可能尝试回退到更简单但更安全的处理方式
}这种方法的优势在于:
- 更具包容性:可以处理更多类型的用户输入。
- 减少维护:不需要为每个新发现的特殊字符更新代码。
- 更好的用户体验:减少因特殊字符导致的失败。
- 更安全:通过主动清理和转义,降低了安全风险。
在实际实现中,可能需要根据应用程序的具体需求和上下文来调整这些策略,但采用这种更通用的方法可以显著减少因特殊字符导致的问题。