C# 是否可以包含像+、*、/和-这样的符号,以便以base64格式进行编码?
我正在使用base64加密html标记,以解决代码的回发问题。我的html标记包含+、-、/或*等符号。解密加密字符串时,我收到以下错误:C# 是否可以包含像+、*、/和-这样的符号,以便以base64格式进行编码?,c#,javascript,asp.net,html,base64,C#,Javascript,Asp.net,Html,Base64,我正在使用base64加密html标记,以解决代码的回发问题。我的html标记包含+、-、/或*等符号。解密加密字符串时,我收到以下错误: "<tbody id=\"selectedColumnsTbody\">\n <tr style=\"cursor: move;\" id=\"ExprCountryMasterID10\"><td></td><td><input id=\"chk\" c
"<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
Base-64字符数组的长度无效
"<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
有人能建议一个解决办法吗
"<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
从aspx页面调用JavaScript
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;
}
"<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
错误可以通过给出一个包含我提到的任何符号甚至空格字符的简单字符串来生成
"<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
Html字符串:
"<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页调用解密方法:
"<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
受保护的无效页\u加载对象发送方,事件参数e
{
"<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
//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;
}
}
}
"<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
Javascript,我在其中调用htmlEncode
函数StoreSessionForHtmlHTML内容{
"<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
//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;
}
}
// 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);
}
为什么不使用
"<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
为了防止攻击编码任何字符都不应该有任何问题,因为您不是在编码字符,而是在编码字节
"<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
我假设您遇到的错误是由于base64编码字符串的长度不正确。base64编码有效地将三个字节的组更改为四个字符的组。这意味着解码器将需要一个四个字符的倍数的字符串进行解码。这是通过使用特殊字符=t来实现的o填充。这允许解码器知道这些字节不存在,而不仅仅是空白或确实丢失
"<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
很有可能是因为正在解码的字符串中的字符数而出现问题
"<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
可能有助于验证您生成的字符串,以检查您的问题是否与编码或解码有关。请添加更多详细信息,如果您添加代码会很好。请添加您正在做什么/如何做的代码片段。如果您想让我们知道代码中的某些值,例如您正在编码的字符串如果下面的答案不充分,那么我们可能能够进行更多的调试。这是一个表,其中的列包含+10之类的文本。如果你从javascript中获得+的话,那么绝对不应该在任何在线base64解码器中得到解码。因为他是用javascript编码的,而不是.net语言。加密是在客户端完成的。是否有类似的东西我可以在客户端使用?@newBie:。这似乎表明您正在尽可能地完成它,因为这看起来像您正在使用的函数。@serghei:另外,我不确定Html编码是否真的会特别有用。它可以很容易地完成一旦他开始传输,我不确定他与Base64编码和解码的问题是否有任何关系…我收回我以前的评论。我想你是建议他在发送到服务器和dec之前,不要使用Base64来回避传递HTML标记的问题,而是先对其进行HTML编码在到达那里时对其进行编码。这可能会起作用,但可能取决于为此选择base64编码的原因……是的,他的脚本与其他在线资源完全相同。我已经用控制台应用程序和HTML文件对其进行了测试,似乎无法将其破坏。@NewBie,有没有办法确保您的字符串在传输过程中不会被损坏?这是一个问题在纯文本方面做得很好,我通过编码一个空格字符来确保这一点,它会抛出错误。我只是将您的代码直接复制到控制台应用程序和HTML页面中;使用该页面对值进行编码,然后将其传递到控制台应用程序。它解码得很好。我尝试了一系列变体,例如a+b-c=D。如果您使用c进行调试,可以使用y确认传递给解码方法的字符串是什么?以及如何传递?如果将某些基本64个字符放入查询字符串中,可能会导致问题,因为它们在那里可能有特殊的含义…这可能意味着在提取它们时,它们与您认为的不完全相同…当对包含空格的字符串进行编码,得到的值是多少?编码后的字符串应该是IA==。然后,验证解码方法中得到的值是否正确。
"<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