【发布时间】:2014-10-25 15:43:20
【问题描述】:
我正在开发一个评论部分页面,我使用文本框、按钮和 gridview 控件来插入 cmets 并分别显示它们。我在 gridview 外面有一个文本框,用于添加 cmets,同时我在 gridview 内还有另一个文本框,用于添加对每个 cmets 的回复。我分别在 gridview 控件中显示了所有 cmets 和回复。我注意到,如果我使用下面的语法从位于 gridview 外部的文本框中输入 cmets
string comment = Server.HtmlEncode(TextBox2.Text.Replace("'", "''"));
comment = Server.HtmlEncode(comment.Replace("\r\n", "<br/>"));
connection.Open();
string sql = "INSERT INTO [ComTab]([Name],[Comments]) Values('" + commentor + "','" + comment + "')";
SqlCommand cmd = new SqlCommand(sql, connection);
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
cmd.Dispose();
connection.Close();
如果您正在制作多段 cmets,我可以将此行
连同我的 cmets 一起保存到我的数据库中。所以没有任何问题,这就是我想要的。
现在相反,如果我使用以下代码在位于 gridview 内的文本框中输入回复
Button btn2 = (Button)sender;
GridViewRow row = (GridViewRow)btn2.NamingContainer;
TextBox gridtxt2 = row.FindControl("TextBox4") as TextBox;
string reply = Server.HtmlEncode(TextBox3.Text.Replace("'", "''"));
reply = Server.HtmlEncode(reply.Replace("\r\n", "<br/>"));
connection.Open();
string sql = "INSERT INTO [RepTab]([Name],[Replies]) Values('" + commentor + "','" + reply + "')";
SqlCommand cmd = new SqlCommand(sql, connection);
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
cmd.Dispose();
connection.Close();
我无法再将这一行连同我的回复一起保存到我的数据库中,这就是为什么如果用户输入多段落回复,它不会显示多段回复,而是压缩成一个长段落。那么我如何才能将这一行
连同我的回复一起保存到我的数据库中?有什么建议?谢谢...
【问题讨论】:
-
检测到 Sql 注入 :) 我确实希望有人会添加回复 ');删除表用户;--
-
你有什么建议?什么意思?
-
Ondrej 的意思是,如果您使用字符串连接来创建一个 SQL 字符串,然后发送到数据库,那么您很容易受到有人向您尝试执行的命令添加额外的 SQL 命令的攻击.这意味着有人可能会删除您的数据库,因为权限并没有阻止他。更好的方法是在查询中使用 SQL 参数,这样可以防止 SQL 注入。所以你可以把它叫做 sql = "insert into x(a,b) values(@paramA, @paramB)"。然后在下面你会调用 cmd.Parameters.AddWithValue("@paramA", textbox1.Value) 等。希望清除它。
-
您想从您的 html 回复中删除“
”吗?? -
@Ganesh_Devlekar 不。我不想删除这一行 <br/><br/>输入回复时等于换行符或
以便在用户输入多段回复时我可以以正确的格式显示回复。