国际化安全

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

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

当翻译人员向您提交本地化版本时,请始终检查以确保他们的翻译中没有包含垃圾邮件或其他恶意词语。您可以使用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 二进制文件

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

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

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