国际化安全

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

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

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

Escape国际化字符串

你不能相信翻译者只会在本地化中增加良性文本; 如果他们想要,他们可以添加恶意JavaScript或其他代码。 为了保护这一点,重要的是要像国际化的字符串一样处理任何其他不可信任的输入。

如果你输出的字符串,那么应该被转义。

不安全

<?php _e( 'The REST API content endpoints were added in WordPress 4.7.', 'your-text-domain' ); ?>

安全:

<?php 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()的占位符。

不安全

<?php _e(
    'Please <a href="https://wordpress.org/support/register.php">
     register for a WordPress.org account</a>.',
    'your-text-domain'
); ?>

安全:

<?php printf(
    __(
        'Please <a href="%s">register for a WordPress.org account</a>.',
        'your-text-domain'
    ),
    'https://wordpress.org/support/register.php'
); ?>

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

翻译者通常会发送编译的.mo文件以及纯文本.po文件,但是您应该放弃他们的.mo文件并自己编译,因为您无法知道是否从相应的.po文件中编译, 或不同的。 如果是根据不同的编译,那么可能会包含垃圾邮件和其他恶意的字符串。

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

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