首页 / 插件开发手册 / 国际化 / 国际化安全性

国际化安全性

在谈到国际化时,安全性往往被忽视,但有几件重要的事情需要记住。

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

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

 

转义国际化字符串

你不能相信译者只会在本地化中添加良性文本,如果他们愿意,可以添加恶意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