Можно ли включать такие символы, как +, *, / и - для кодирования в формате base64? - PullRequest
0 голосов
/ 02 июня 2011

Я использую base64 шифрование HTML-тегов, чтобы решить проблему обратной передачи с моим кодом.Мой HTML-тег содержит символы, такие как +, -, / или *.При расшифровке зашифрованной строки я получаю следующую ошибку:

Недопустимая длина для массива символов Base-64.

Может кто-нибудь предложить здесь обходной путь, пожалуйста?

Вызов JavaScript изaspx page.

 var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    function encode64(input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;

        while (i < input.length) {
            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            }

            else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output += keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
        }

        return output;
    }

C # Код для декодирования строки @ pageload:

 public string DecodeBase64String(string encodedData)
    {
        byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
        string returnValue = System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);

        return returnValue;
    }

Ошибка может быть сгенерирована путем предоставления простой строки, содержащей любой из символов, которые я упомянул, иличетный пробел.

Html String:

"<tbody id=\"selectedColumnsTbody\">\n                    <tr style=\"cursor: move;\" id=\"ExprCountryMasterID10\"><td></td><td><input id=\"chk\" checked=\"checked\" class=\"textChangeClass\" type=\"checkbox\"></td><td>CountryMaster.ID + 10</td><td><input id=\"aliastextCountryMasterID10\" class=\"aliasTextChangeClass\" value=\"\" type=\"text\"></td>><td><input id=\"hiddenIDSortCountryMasterID10\" value=\"\" type=\"hidden\"></td></tr></tbody>\n        

Вызов метода расшифровки со страницы cs:

protected void Page_Load (отправитель объекта, EventArgs e) {

        //HtmlTextWriter htmlTable = new HtmlTextWriter();

        //htmlTable.InnerHtml = htmlContent;
        //Master.FindControl("ContentPlaceHolder1").Controls.Add(htmlTable);
        if (Session["HtmlTable"] != null)
        {

            htmlContent = Session["HtmlTable"].ToString();
            //htmlContent = htmlContent.Replace(" ", "+");
            htmlContent = DecodeBase64String(htmlContent);
            htmlTable = new HtmlGenericControl();
            ContentPlaceHolder contentPlaceHolder = (ContentPlaceHolder)this.Master.FindControl("ContentPlaceHolder1");
            if (contentPlaceHolder != null)
            {
                htmlContent = "<table cellspacing=\"0\" cellpadding=\"0\" id=\"selectedColumns\" width=\"100%\">" + htmlContent + "</table>";
                htmlTable.InnerHtml = htmlContent;
                test.InnerHtml = htmlContent;
            }
        }

}

Javascript, где я вызываю функцию htmlEncode StoreSessionForHtml (htmlContent) {

        //            var encodedObject = htmlEncode(htmlContent);
        //            var decodedObject = htmlDecode(encodedObject);
        //htmlContent = htmlContent.replace(/ /g, "+");


        var encodedObject = encode64(htmlContent);

        var requesthtmlContentParameter = '{' +
                        'htmlContentToServer:"' + encodedObject + '"}';

        $.ajax({
            type: "POST",
            url: "Webtop.aspx/HTMLTableContent",
            data: requesthtmlContentParameter,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(msg) {
                //alert("Success", msg.d);
            }, //Event that'll be fired on Success
            error: function() {
               // alert("Try Again");

            } //Event that'll be fired on Error
        });
        $("#<%= HiddenHtmlContainer.ClientID %>").val(encodedObject);
    }

Ответы [ 2 ]

0 голосов
/ 02 июня 2011

Не должно быть никаких проблем с кодированием любого символа, поскольку вы не кодируете символы, вы кодируете байты.

Я полагаю, что вы получаете ошибку из-за неправильной длины вашей строки в кодировке base64. Кодирование Base 64 эффективно превращает группы из трех байтов в группы из четырех символов. Это означает, что декодеры захотят декодировать строку, кратную четырем символам. Это достигается с помощью специального символа "=", чтобы дополнить его. Это позволяет декодеру знать, что эти байты не существуют (в отличие от того, что они пустые или действительно отсутствуют).

Скорее всего, у вас возникла проблема только из-за количества символов в строке, которую вы декодировали.

http://base64encode.org/ может быть полезно для проверки генерируемых вами строк, чтобы проверить, связана ли ваша проблема с кодировкой или декодированием.

0 голосов
/ 02 июня 2011

Почему бы не использовать метод HttpUtility.HtmlEncode

для предотвращения атаки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...