MITM risk of not sanitizing?

时间:2020-10-28 作者:the_nuts

插件审查小组拒绝了我的插件,因为他们说我没有清理数据。以下是片段:

function add_cookie_to_order( $order_id ) {
    if ( isset( $_COOKIE[\'tm_clickid\'] ) && preg_match( \'/^[A-Z][A-Z][A-Z]?[0-9a-f]{32}$/\', $_COOKIE[\'tm_clickid\'] ) ) {
        update_post_meta( $order_id, \'tm_clickid\', $_COOKIE[\'tm_clickid\'] );
    }
}
我指出preg_match 非常严格,只允许2或3个大写字符+32个十六进制字符,但他们回答:

如您所见,我们在第54行(之前的第52行)使用preg\\u match进行消毒。

除非你不是。您正在进行验证,但由于检查和保存之间存在差距,您将面临MITM攻击。这就是为什么你总是在储蓄时进行消毒。这就是为什么我们这样说:

您仍然需要进行清理,因为一次适时的MITM攻击将消除您的检查。

我真的不明白在哪里;检查和保存之间的间隙;是的,MITM怎么可能发生。。。

这样可以吗?(我没有看到任何安全性的提高,只有无用的开销):

if ( isset( $_COOKIE[\'tm_clickid\'] ) && preg_match( \'/^[A-Z][A-Z][A-Z]?[0-9a-f]{32}$/\', $_COOKIE[\'tm_clickid\'] ) ) {
    $tm_clickid = sanitize_text_field( $_COOKIE[\'tm_clickid\'] );
    update_post_meta( $order_id, \'tm_clickid\', $tm_clickid );
}

1 个回复
SO网友:the_nuts

这是WordPress插件审查小组的官方答案:

PHP一次运行一个进程。

如果步骤1为;“验证”;步骤2是保存,然后在步骤1和步骤2之间发生MITM。

现在你可能会想;但是拜托,这里什么都不可能发生!那太快了"E;很有可能你是99%正确的。但是那百分之一值得冒险吗?不,当你可以把它包装起来,清洗干净,从一个比你或我更聪明的黑客手中拯救自己的时候就不行了。

记住,很多人都会说“你确定吗?”事实上,我们从来没有。

这很好:

函数add\\u cookie\\u to\\u order($order\\u id){if(isset($\\u cookie[\'tm\\u clickid\'))&preg\\u match(\'/^[A-Z][A-Z][A-Z][A-Z]?[0-9a-f][32}$/\',$\\u cookie[\'tm\\u clickid]){$tm\\u clickid=清理\\u文本字段($\\u cookie[\'tm\\u clickid\');更新\\u post\\u meta($order\\u id,\'tm\\u clickid\')。,$tm\\u clickid);}}}

因此,您必须这样做,并通过wordpress sanitize函数传递变量,才能批准插件。