我在asp.net中使用mysql来保存数据库中的数据。使用server.HTMLEncode()后在数据库中保存数据时,删除\后保存数据。这就是我保存数据的方式
INSERT INTO Users(ID,Name) Values(1,Server.HTMLEncode(User.Identity.Name))
在这种情况下,如果name为XXX \ ABC,则保存为XXXABC。保存在DB中时删除斜杠。
下次当我阅读相同内容时,我需要检查登录用户是否是我保存数据的用户,所以我按照
进行操作if ( existingRowEditor == Server.HtmlEncode(User.Identity.Name))
{
}
但问题是上述条件总是假的,因为我有以下值
existingRowEditor="XXXABC"
和Server.HtmlEncode(User.Identity.Name) =XXX\\ABC
。
那么如何判断上述情况是否属实?
答案 0 :(得分:1)
HTML编码不适合编码数据库中存储的数据。
反斜杠消失的原因是您将SQL代码粘贴在一起,并对文本进行编码以便在网页中显示,而不是将其作为SQL查询中的文本进行转义。反斜杠在MySQL中用作转义字符,因此字符串中的任何bacslashes都将转义下一个字符。
优选地,您应该使用参数化查询,而不是将数据连接到SQL查询中。如果那是不可能的,那么必须正确地将文本转义为SQL代码中的字符串文字,因此必须用双反斜杠替换每个反斜杠,并在每个撇号前加一个反斜杠。如果你无法正确地逃避它,那么你的应用程序将会大张旗鼓地进行SQL注入攻击。
HTML编码值应该在您在网页中显示时完成,而不是在将其放入数据库之前。
答案 1 :(得分:0)
您可以使用以下内容:
var sqlQueryString = "INSERT INTO Users(ID,Name) Values(@Id,@Name)";
var sqlCommand = new SqlCommand(sqlQueryString, sqlConnection);
sqlCommand.Parameters.Add(new SqlParameter("Id", 1);
sqlCommand.Parameters.Add(new SqlParameter("Name", User.Identity.Name);
sqlCommand.ExecuteNonQuery();