在谈论国际化时,安全往往被忽视,但有一些重要的事情需要注意。
检查垃圾邮件和其他恶意字符串
当翻译者向您提交本地化内容时,务必检查他们是否在翻译中包含了垃圾邮件或其他恶意词汇。您可以使用 Google 翻译 将其翻译回您的母语,以便轻松比较原始字符串和翻译后的字符串。
转义国际化字符串
您不能信任翻译者只会向其本地化内容添加良性文本;如果他们想这样做,他们可能会添加恶意的 JavaScript 或其他代码。为了防止这种情况,重要的是将国际化字符串像处理任何其他不受信任的输入一样进行处理。
如果您输出这些字符串,则应对它们进行转义。
不安全:
_e( 'The REST API content endpoints were added in WordPress 4.7.', 'your-text-domain' ); 安全:
esc_html_e( 'The REST API content endpoints were added in WordPress 4.7.', 'your-text-domain' );或者,有些人选择依赖翻译验证机制,而不是在代码中添加转义。一个验证机制的例子是 WordPress Polyglots 团队用于 translate.wordpress.org 的 编辑器角色。这确保任何由不受信任的贡献者提交的翻译在提交之前都会经过受信任的编辑者的验证。
使用占位符表示 URL
不要在国际化字符串中包含 URL,因为恶意的翻译者可能会将其更改为指向不同的 URL。相反,请使用 printf() 或 sprintf() 的占位符。
不安全:
_e(
'Please <a href="https://login.wordpress.org/register"> register for a WordPress.org account</a>.',
'your-text-domain'
);安全:
printf(
esc_html__( 'Please %1$s register for a WordPress.org account %2$s.', 'your-text-domain' ),
'<a href="https://login.wordpress.org/register">',
'</a>'
);编译您自己的 .mo 二进制文件
通常翻译者会连同纯文本 .po 文件一起发送编译好的 .mo 文件,但您应该丢弃他们的 .mo 文件并自行编译,因为您无法知道它是否是从相应的 .po 文件或其他文件中编译的。如果它是针对不同的文件编译的,那么它可能会在您不知情的情况下包含垃圾邮件和其他恶意字符串。
使用 PoEdit 生成二进制文件会覆盖 .po 文件中的标题,因此最好从命令行进行编译:
msgfmt -cv -o /path/to/output.mo /path/to/input.po