C# 删除用户输入字段中过多的空白
在我处理(潜在恶意)用户输入字段的控制器方法中,我有以下代码:C# 删除用户输入字段中过多的空白,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,在我处理(潜在恶意)用户输入字段的控制器方法中,我有以下代码: string tmptext = comment.Replace(System.Environment.NewLine, "{break was here}"); //marks line breaks for later re-insertion tmptext = Encoder.HtmlEncode(tmptext); //other sanitizing goes in here tmptext = tmptext.Rep
string tmptext = comment.Replace(System.Environment.NewLine, "{break was here}"); //marks line breaks for later re-insertion
tmptext = Encoder.HtmlEncode(tmptext);
//other sanitizing goes in here
tmptext = tmptext.Replace("{break was here}", "<br />");
var regex = new Regex("(<br /><br />)\\1+");
tmptext = regex.Replace(tmptext, "$1");
string tmptext=comment.Replace(System.Environment.NewLine,“{break was here}”)//标记换行符,以便以后重新插入
tmptext=Encoder.HtmlEncode(tmptext);
//这里还有其他消毒措施
tmptext=tmptext.Replace(“{break was here}”,“
”);
var regex=new regex(“(
)\\1+”;
tmptext=regex.Replace(tmptext,“$1”);
我的目标是为典型的非恶意使用保留换行符,并以安全的HTML编码字符串显示用户输入。我接受用户输入,分析它的换行符,并在换行符处放置分隔符。我执行HTML编码并重新插入中断。(我可能会将此更改为将段落重新插入为p标记而不是br,但现在我使用br)
现在,实际上插入真正的html中断让我面临一个微妙的漏洞:回车键。regex.replace代码就是用来清除一个站在enter键上用垃圾填充页面的恶意用户的
这是一个修复的大垃圾洪水只是白色,但仍然让我打开滥用,如输入一个字符,两个换行符,一个字符,两个换行符,所有的页面
我的问题是要找到一种方法来确定这是一种滥用,并且在验证中失败。我担心可能没有一个简单的程序方法来实现它,而是需要启发式技术或贝叶斯过滤器。希望有人有一个更简单,更好的方法
编辑:也许我在问题描述中不清楚,正则表达式处理在一行中看到多个换行符并将它们转换为一个或两个。这个问题解决了。真正的问题是区分合法文本和垃圾泛滥,就像这样:
a
a
a
…想象一下其中的1000个
a
a
a
听起来你很想用正则表达式尝试一些“聪明”的东西,但我认为最简单的方法是循环字符串中的字符,将它们复制到StringBuilder中,边过滤边过滤 未通过char.IsWhiteSpace()测试的任何文件都不会被复制。(如果其中一个是换行符,则插入一个
,并且在输入非空白字符之前,不允许再添加任何
) 编辑 如果你想阻止用户输入任何旧的废话,现在就放弃。如果用户真的想,你永远也找不到一种用户在一分钟内找不到的过滤方法 最好对输入中的换行数或字符总数进行限制
想想做一些聪明的事情来清理“坏的输入”需要花费多少的努力,然后考虑这将发生的可能性。可能没有意义。可能您真正需要的所有消毒都是为了确保数据合法(对于您的系统来说,数据不会太大,无法处理,所有危险字符都会被删除或转义,等等)。(这正是为什么论坛有人类版主,他们可以根据任何合适的标准过滤帖子)。我会
HttpUtility.HtmlEncode
字符串,然后将换行符转换为
HttpUtility.HtmlEncode(subject).Replace("\r\n", "<br/>").Replace("\r", "<br/>").Replace("\n", "<br/>");
我不确定您是否需要
RegexOptions.Singleline
而不是尝试用过滤文本替换换行符,然后尝试在其上使用正则表达式,为什么不在插入
标记之前清理数据?别忘了先用HttpUtility.HtmlEncode
清理输入
为了处理一行中的多条短线,以下是我的最佳尝试:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program {
static void Main() {
// Arbirary cutoff used to join short strings.
const int Cutoff = 6;
string input =
"\r\n\r\n\n\r\r\r\n\nthisisatest\r\nstring\r\nwith\nsome\r\n" +
"unsanatized\r\nbreaks\r\nand\ra\nsh\nor\nt\r\n\na\na\na\na" +
"\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na";
input = (input ?? String.Empty).Trim(); // Don't forget to HtmlEncode it.
StringBuilder temp = new StringBuilder();
List<string> result = new List<string>();
var items = input.Split(
new[] { '\r', '\n' },
StringSplitOptions.RemoveEmptyEntries)
.Select(i => new { i.Length, Value = i });
foreach (var item in items) {
if (item.Length > Cutoff) {
if (temp.Length > 0) {
result.Add(temp.ToString());
temp.Clear();
}
result.Add(item.Value);
continue;
}
if (temp.Length > 0) { temp.Append(" "); }
temp.Append(item.Value);
}
if (temp.Length > 0) {
result.Add(temp.ToString());
}
Console.WriteLine(String.Join("<br />", result));
}
}
using System;
using System.Text.RegularExpressions;
class Program {
static void Main() {
string input = "\r\n\r\n\n\r\r\r\n\nthisisatest\r\nstring\r\nwith\nsome" +
"\r\nunsanatized\r\nbreaks\r\n\r\n";
input = (input ?? String.Empty).Trim().Replace("\r", String.Empty);
string output = Regex.Replace(
input,
"\\\n+",
"<br />",
RegexOptions.Multiline);
Console.WriteLine(output);
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
班级计划{
静态void Main(){
//用于连接短字符串的任意截断。
常数int截止=6;
字符串输入=
“\r\n\r\n\r\r\n\r\n\n使用\r\n某些\r\n”+
“未固定\r\n断裂\r\n和\r\n断裂\r\n或\nt\r\n\na\na\na\na”+
“\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na”;
input=(input??String.Empty).Trim();//别忘了对它进行HtmlEncode。
StringBuilder temp=新的StringBuilder();
列表结果=新列表();
var items=input.Split(
新[]{'\r','\n'},
StringSplitOptions.RemoveEmptyEntries)
.Select(i=>new{i.Length,Value=i});
foreach(项目中的var项目){
如果(项目长度>截止){
如果(温度长度>0){
添加(temp.ToString());
温度清除();
}
结果.增加(项目.值);
持续
}
如果(temp.Length>0){temp.Append(“”;}
临时附加(项目值);
}
如果(温度长度>0){
添加(temp.ToString());
}
Console.WriteLine(String.Join(“
”,result));
}
}
生成以下输出:
thisisatest<br />string with some<br />unsanatized<br />breaks and a sh or t a a
a a a a a a a a a a a a a a a a a a a
thisisatest<br />string<br />with<br />some<br />unsanatized<br />breaks
thisistest
字符串中有一些
未固定的
断点和一个sh或ta
a a a a a a a a a a a a a a a a a a a a a a a a
我相信你已经想出了这个解决方案,但不幸的是,你要求的不是很直截了当
对于那些感兴趣的人,以下是我的第一次尝试:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program {
static void Main() {
// Arbirary cutoff used to join short strings.
const int Cutoff = 6;
string input =
"\r\n\r\n\n\r\r\r\n\nthisisatest\r\nstring\r\nwith\nsome\r\n" +
"unsanatized\r\nbreaks\r\nand\ra\nsh\nor\nt\r\n\na\na\na\na" +
"\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na\na";
input = (input ?? String.Empty).Trim(); // Don't forget to HtmlEncode it.
StringBuilder temp = new StringBuilder();
List<string> result = new List<string>();
var items = input.Split(
new[] { '\r', '\n' },
StringSplitOptions.RemoveEmptyEntries)
.Select(i => new { i.Length, Value = i });
foreach (var item in items) {
if (item.Length > Cutoff) {
if (temp.Length > 0) {
result.Add(temp.ToString());
temp.Clear();
}
result.Add(item.Value);
continue;
}
if (temp.Length > 0) { temp.Append(" "); }
temp.Append(item.Value);
}
if (temp.Length > 0) {
result.Add(temp.ToString());
}
Console.WriteLine(String.Join("<br />", result));
}
}
using System;
using System.Text.RegularExpressions;
class Program {
static void Main() {
string input = "\r\n\r\n\n\r\r\r\n\nthisisatest\r\nstring\r\nwith\nsome" +
"\r\nunsanatized\r\nbreaks\r\n\r\n";
input = (input ?? String.Empty).Trim().Replace("\r", String.Empty);
string output = Regex.Replace(
input,
"\\\n+",
"<br />",
RegexOptions.Multiline);
Console.WriteLine(output);
}
}
使用系统;
使用System.Text.RegularExpressions;
班级计划{
静态void Main(){
字符串输入=“\r\n\r\n\n\r\r\n\n\n isisatest\r\n字符串\r\n与\n某些”+
“\r\n未加密\r\n漏洞\r\n\r\n”;
input=(input??String.Empty).Trim().Replace(“\r”,String.Empty);
字符串输出=Regex.Replace(
输入
“\\\n+”,
“
”,
RegexOptions.Multiline);
控制台写入线(输出);
}
}
产生以下输出:
thisisatest<br />string with some<br />unsanatized<br />breaks and a sh or t a a
a a a a a a a a a a a a a a a a a a a
thisisatest<br />string<br />with<br />some<br />unsanatized<br />breaks
thisistest
字符串
带有
一些
未初始化的
断点
T