如何对带有HTML标签的字符串进行base64编码和解码?

3

我遇到了一个关于base64解码的问题。例如,我有以下代码:

else if($_POST['submit']==2){
        $send = base64_encode($text_success);
        wp_redirect( home_url('/sales-funnel/add-product?msg='.$send) ); exit;
    }

我将编码后的字符串发送到页面,这样用户就无法从url中轻易地阅读它。 $text_success包含html代码,如果$wpdb->query不包含错误,则生成该代码:

 `Darījums veiksmīgi pievienots!</br>Komentārs veiksmīgi pievienots!</br>Klients veiksmīgi pievienots!</br>Fāze ir pievienota! </br>`

在所有在线base64_decode中,它都运行良好,但是当我尝试执行以下操作时,我的WordPress网站返回空字符串:

if (isset($_GET['msg']) && !empty($_GET['msg'])){
    $text = base64_decode($_GET['msg']);
    echo $text;
}

但是,$_GET['msg'] = RGFyxKtqdW1zIHZlaWtzbcSrZ2kgcGlldmllbm90cyE8L2JyPktvbWVudMSBcnMgdmVpa3NtxKtnaSBwaWV2aWVub3RzITwvYnI+S2xpZW50cyB2ZWlrc23Eq2dpIHBpZXZpZW5vdHMhPC9icj5GxIF6ZSBpciBwaWV2aWVub3RhISA8L2JyPg==

P.S. 我尝试过不使用html标签,一切都很好。


1
我曾经遇到过一个类似的问题,看起来 WordPress 使用安全回调来防止使用 HTML 标签以避免注入。但是我强烈不建议禁用此类安全措施,并更一般地不建议使用 $_GET 来检索页面的 HTML 内容。 - ibi0tux
1个回答

2
问题与base64字母表不适用于URL有关。在这种特殊情况下,您的base64编码字符串包含一个“+”,被解释为空格。
要解决此问题,您可以选择以下方法之一:
  • 使用URL安全版本的base64字母表,即将“+”替换为“-”,将“/”替换为“_”,并修剪尾随的“=”填充,如RFC4648中所述。 此答案包括此方法的代码示例。
  • 在base64编码后对内容进行URL编码,将“+”转换为“%2B”,将“/”转换为“%2F”,将“=”转换为“%3D”。
这应该可以解决您的问题,但不用说,在不受信任的环境中,允许用户向您的站点注入原始HTML会构成严重的安全风险。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接