留言功能应该是每个动态网站都具备的功能,我想问问大家是用什么技术或者方法来实现的?直接在textarea输入?如果别人恶意地输入了JS脚本怎么办?如果用过滤的方法,一些懂HTML的人想用点个性代码怎么办?不可能<b>、<font>什么的都过滤了吧?另外如果是讨论编程的,更是一个代码也不能过滤。如果是在textarea上输入,大家怎么处理换行?有的人会用在线编辑器,但别人只是想说几句就要加载一个庞大的编辑器就太不应该了..而且在线编辑器的外观不好控制。总之,本人现在烦于处理这个小小的功能...想听听大家的意见。
要么用在线编辑器,要么自己写一个.如果你只想要一个简单的东西,
你可以就用textarea就行了,
对于你所说的安全问题过滤一下就即可,
如果你还想给留言者一些自由又考虑安全问题,
你可以只过滤javascript,这并不难实现
至于你所说的换行问题,是很容易处理的,只要进度一次替换操作即可
假如string内收到了你的textarea内的内容,只要用下面的代码就可以保留换行
string.Replace("\n", "<br />");
public static string SqlInsertEncode(string strFromText)
{
if (!System.String.IsNullOrEmpty(strFromText) && strFromText != "")
{
//strFromText = strFromText.Replace(";", ";");
strFromText = strFromText.Replace("!", "!");
//strFromText = strFromText.Replace("@", "@");
strFromText = strFromText.Replace("$", "$");
strFromText = strFromText.Replace("*", "*");
strFromText = strFromText.Replace("(", "(");
strFromText = strFromText.Replace(")", ")");
strFromText = strFromText.Replace("-", "-");
strFromText = strFromText.Replace("+", "+");
//strFromText = strFromText.Replace("=", "=");
strFromText = strFromText.Replace("|", "|");
strFromText = strFromText.Replace("\\", "\");
//strFromText = strFromText.Replace("/", "/");
//strFromText = strFromText.Replace(":", ":");
strFromText = strFromText.Replace("\"", """);
strFromText = strFromText.Replace("'", "'");
strFromText = strFromText.Replace("<", "<");
strFromText = strFromText.Replace(" ", " ");
strFromText = strFromText.Replace(">", ">");
strFromText = strFromText.Replace(" ", " ");
}
return strFromText;
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write(SqlInsertEncode(TextBox1.Text));
//输入:<b><script>asdf<div>
//输出:<b><script>asdf<div>
}
给用户一些自由,
允许用户输入一些HTML的话2楼的代码是不行的,
仅仅下面这两行代码就过滤了所有的HTML代码
strFromText = strFromText.Replace("<", "<");
strFromText = strFromText.Replace(">", ">");
麻烦你先试一下我的代码,html源代码<在页面中显示出来就是<,其它也类似。。
明白,但楼主是打算允许用户输入一些有个性的HTML代码
你认为下面的字会显示红色吗?
<font color="red">红色字</font>
晕,上面不是过滤<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<asp:TextBox ID="TextBox1" runat="server" Width="298px" TextMode="multiLine"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
</form>
</body>
</html>后台:
public static string SqlInsertEncode(string strFromText)
{
if (!System.String.IsNullOrEmpty(strFromText) && strFromText != "")
{
//strFromText = strFromText.Replace(";", ";");
strFromText = strFromText.Replace("!", "!");
//strFromText = strFromText.Replace("@", "@");
strFromText = strFromText.Replace("$", "$");
strFromText = strFromText.Replace("*", "*");
strFromText = strFromText.Replace("(", "(");
strFromText = strFromText.Replace(")", ")");
strFromText = strFromText.Replace("-", "-");
strFromText = strFromText.Replace("+", "+");
//strFromText = strFromText.Replace("=", "=");
strFromText = strFromText.Replace("|", "|");
strFromText = strFromText.Replace("\\", "\");
//strFromText = strFromText.Replace("/", "/");
//strFromText = strFromText.Replace(":", ":");
strFromText = strFromText.Replace("\"", """);
strFromText = strFromText.Replace("'", "'");
strFromText = strFromText.Replace("<", "<");
strFromText = strFromText.Replace(" ", " ");
strFromText = strFromText.Replace(">", ">");
strFromText = strFromText.Replace(" ", " ");
strFromText = strFromText.Replace("\n", "<br />");
}
return strFromText;
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write(SqlInsertEncode(TextBox1.Text));
}楼主你先在TextBox1中输入js脚本等试下看它的运行结果,你就知道了~
写一段代码给你吧(代码未测试 如果有问题自己改一下)string strFromText = "你的相关字符";
Regex re = new Regex@"<javascript[^>]*>[^<]*</script>",RegexOptions.IgnoreCase);//正则匹配javascript
MatchCollection mc = re.Matches(strFromText);
foreach (Match ma in mc)//循环,以便匹配所有javascript
{
string temStr=ma.Value;//如果匹配到将其付给变量
string temNoHTML=temStr.Replace(" <", "<");//将得到的内容过滤HTML后并付给另一变量
temNoHTML=temStr.Replace(">", ">"); //同上
strFromText=strFromText.Replace(temStr,temNoHTML);//将这部分内容替换成过滤过的内容
}
string strFromText = "你的相关字符";
//之前下面这个地方漏了一个括号:(
Regex re = new Regex(@"<javascript[^>]*>[^<]*</script>",RegexOptions.IgnoreCase);//正则匹配javascript
MatchCollection mc = re.Matches(strFromText);
foreach (Match ma in mc)//循环,以便匹配所有javascript
{
string temStr=ma.Value;//如果匹配到将其付给变量
string temNoHTML=temStr.Replace(" <", "<");//将得到的内容过滤HTML后并付给另一变量
temNoHTML=temStr.Replace(">", ">"); //同上
strFromText=strFromText.Replace(temStr,temNoHTML);//将这部分内容替换成过滤过的内容
}
是我写错误了一点个地方你没注意吧string strFromText = "<javascript>fdsafda你的相关字符</script>";
Regex re = new Regex(@"<javascript[^>]*>[^<]*</script>", RegexOptions.IgnoreCase);//正则匹javascript
MatchCollection mc = re.Matches(strFromText);
foreach (Match ma in mc)//循环,以便匹配所有javascript
{
string temStr = ma.Value;//如果匹配到将其付给变量
string temNoHTML = temStr.Replace("<", "<");//将得到的内容过滤HTML后并付给另一变量
//注意下面的与之前写的比较一下你应该明白了.
temNoHTML = temNoHTML.Replace(">", ">"); //同上
strFromText = strFromText.Replace(temStr, temNoHTML);//将这部分内容替换成过滤过的内容
}
用这试试吧,只过滤javascript代码,HTML代码不过滤
例如:
<font color="red"><javascript>fdsafda你的相关字符</script></font><javascript gfds gfd>fdsafda你的相关字符</script>
将过滤成
<font color="red"><javascript>fdsafda你的相关字符</script></font><javascript gfds gfd>fdsafda你的相关字符</script>
<font color="red">aaaa</font><script language="javascript">alert("fdsafda你的相关字符") </script> <javascript gfds gfd>fdsafda你的相关字符 </script> <script>alert("aaa")</script>
aaaa <javascript gfds gfd>fdsafda你的相关字符 </script>
然后连续两次弹出消息。差不多了,明白了思路。
你自己慢慢研究吧,
我现在正在写Form程序,刚才也只是在Form环境下测试了一下代码.
现在我要继续写程序了,没有太多时间给你回复了,
如果你能明白给你写的代码的思路,
我想你应该能自己解决问题的.
上面代码的思路是
一、先匹配所有<javascript>.....</script>
二、将这些内容保存到一个变量
三、将这些内容进行替换操作
四、将原字符内的相关字符换成之前改过的内容到此结束,我要工作了
祝你好运!
直接绑定就行了
那么费劲干什么
Response.Write(Server.HtmlEncode("<script>alert('');</script>"));
Response.Write("<script>alert('');</script>");<script>alert('');</script><script>alert('');</script>