跳转到主要内容

国际化安全

在谈论国际化时,安全性常常被忽视,但有一些重要的事情需要牢记。

检查垃圾邮件和其他恶意字符串

当翻译人员向您提交本地化版本时,请务必检查以确保他们的翻译中不包含垃圾邮件或其他恶意词语。您可以使用谷歌翻译 将其翻译翻译回您的母语,以便您可以轻松比较原始字符串和翻译字符串。

转义国际化字符串

您不能相信翻译人员只会在其本地化中添加良性文本;如果他们愿意,他们可以添加恶意 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  register for a WordPress.org account.',
	'your-text-domain'
);

安全的:


printf(
	esc_html__( 'Please %1$s register for a WordPress.org account %2$s.', 'your-text-domain' ),
	'',
	''
);

编译您自己的 .mo 二进制文件

通常翻译人员会将编译后的 .mo 文件与纯文本 .po 文件一起发送,但您应该丢弃他们的 .mo 文件并编译自己的 .mo 文件,因为您无法知道它是否是从相应的 .po 文件编译的,或不同的一个。如果它是针对不同的版本进行编译的,那么它可能会在您不知情的情况下包含垃圾邮件和其他恶意字符串。

使用 PoEdit 生成二进制文件将覆盖 .po 文件中的标头,因此最好从命令行编译它:


msgfmt -cv -o /path/to/output.mo /path/to/input.po