C# 阻止用户在表单中输入URL

C# 阻止用户在表单中输入URL,c#,asp.net-core,asp.net-core-3.0,C#,Asp.net Core,Asp.net Core 3.0,我有一个ASP.NETCore3.0Web应用程序,其中有一个带有多个输入字段的表单。输入字段绑定到一个模型,并且已经进行了一些验证。但是,在其中一个字段中,我想限制用户输入URL地址甚至电子邮件地址(但URL目前更为重要) 我的想法如下:在服务器端提交表单后,检查该字段中的文本,如果该文本包含某个URL,则将其删除或使其无效(例如,添加一些空格)。我的目标是,由于用户的输入稍后将显示在网站中,因此限制任何URL处于活动状态或显示状态,因此,如果另一个用户正在检查该输入,则不会被诱骗单击某些恶意

我有一个ASP.NETCore3.0Web应用程序,其中有一个带有多个输入字段的表单。输入字段绑定到一个模型,并且已经进行了一些验证。但是,在其中一个字段中,我想限制用户输入URL地址甚至电子邮件地址(但URL目前更为重要)

我的想法如下:在服务器端提交表单后,检查该字段中的文本,如果该文本包含某个URL,则将其删除或使其无效(例如,添加一些空格)。我的目标是,由于用户的输入稍后将显示在网站中,因此限制任何URL处于活动状态或显示状态,因此,如果另一个用户正在检查该输入,则不会被诱骗单击某些恶意网站链接

我的问题是:我们在.NETCore3(或以前的版本)上是否已经有了一种机制,可以自动检查用户输入中的URL,并将其删除、使其无效或给出验证错误?我本来打算自己编写整个逻辑,但如果已经完成了(在.NETCore或其他开源库中),那会更好,也会节省我的一些精力

我还想知道是否有一些自定义的验证器,甚至是基本的.Net验证器正在这样做。我可以只在服务器端进行验证,但是如果我们有机会进行客户端验证,那就更好了

到目前为止,我没有任何具体的代码显示。我对一般情况感兴趣,因此如果它对您有帮助,您可以想象一个正常的CRUD形式(从VS生成的CRUD形式)

感谢您的帮助

致以最良好的祝愿, 艾哈迈德

==编辑== 可能我还不够清楚。我很想知道用户输入的文本中是否包含一个或多个URL。如果文本中有任何URL要删除它、以某种方式使其无效或给出验证错误。因此,如果用户输入此文本:

“在这里,你可以找到一些疯狂的交易——你可以买一些高质量的玩具”

要转到以下位置:

“在这里,你可以找到一些疯狂的交易——你可以买一些高质量的玩具”

还是这个

“在这里你可以找到一些疯狂的交易-htp://cra z y d e a l s.c o m/n o t s o c r a z y d e a l s,你可以买一些高质量的玩具”


您可以创建自己的验证器并进行如下验证:

Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) 
&& (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
参考:


正则表达式是解决此问题的最佳方法,可能使用“https:*(=\s)” 此代码将从字符串中删除所有url:

Regex regx = new Regex("https?:.*(?=\s)", RegexOptions.IgnoreCase);

MatchCollection matches = regx.Matches(txt);

foreach (Match match in matches) {
    txt = txt.Replace(match.Value, "");
您还可以使用来基于模式使模型输入无效。这样的属性在客户端和服务器端都将失效

public class TestModel
{
    [RegularExpression(@"^((?!(https?:.*(?=\s))).)*$", ErrorMessage = "URL's are not allowed.")]
    public string Text { get; set; }
}
下面是对RegularExpressionAttribute的测试:

[TestMethod]
public void TestNotUrl()
{
    var modelFail = new TestModel { Text = "Here you can find some crazy deals - http://crazydeals.com/notsocrazydeals and you can buy some high quality toys" };
    var modelPass = new TestModel { Text = "Here you can find some crazy deals - crazydeals.com and you can buy some high quality toys" };

    var result = new List<ValidationResult>();
    var context = new ValidationContext(modelFail) { MemberName = "Text" };
    var expectNotValid = System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(modelFail.Text, context, result);
    var expectValid = System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(modelPass.Text, context, result);

    Assert.IsFalse(expectNotValid, "Expected modelFail.Text not to validate, as it contains a URL.");
    Assert.IsTrue(expectValid, "Expected modelPass.Text to validate, as it does not contain a URL.");
}
[TestMethod]
公共void TestNotUrl()
{
var modelFail=newtestmodel{Text=“在这里你可以找到一些疯狂的交易-http://crazydeals.com/notsocrazydeals 你可以买一些高质量的玩具“};
var modelPass=newtestmodel{Text=“在这里你可以找到一些疯狂的交易——crazydeals.com,你可以买一些高质量的玩具”};
var result=新列表();
var context=newvalidationcontext(modelFail){MemberName=“Text”};
var expectNotValid=System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(modelFail.Text,context,result);
var expectValid=System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(modelPass.Text、context、result);
IsFalse(expectNotValid,“Expected modelFail.Text不进行验证,因为它包含URL”);
IsTrue(expectValid,“预期要验证的modelPass.Text,因为它不包含URL”);
}

我不确定是否足够清楚,但我有兴趣检查文本中是否包含URL(一个或多个),而不是字符串是否为URL。很抱歉给您带来不便。我为这个问题添加了更多的细节?我认为把它变成一个不可点击的解决方案是可行的。然后,实际上您无事可做:输入URL的用户在呈现时不会神奇地将此URL变成锚。您绝对需要确保此字段中未输入HTML,但要避免跨站点脚本编写,这将比URL的问题大得多。net validation应注意在表单输入字段中输入HTML标记,值得测试,但这是一个默认的验证器,需要显式禁用以允许表单中的HTML输入。看:@Derrick:是的,你说得对。默认验证器对我来说运行良好。我在输入html内容方面没有问题(至少到目前为止)。另外,我正在对输入进行编码。我不确定是否足够清楚,但我有兴趣检查文本中是否包含URL(一个或多个),而不是字符串是否为URL。很抱歉给您带来不便。我在问题中添加了更多细节。好的。上面的代码告诉您如何识别URL。可以使用相同的代码检查字符串的多个区域。可能需要检查字符串中的单词“http”。如果发现按空间分割(因为URL没有空间),请应用上述逻辑来确定它是否是有效的URL。然后在字符串中继续。我想我将采用这种方法,让您提到的函数检查链接,然后删除它们或使它们无效。我有点希望,也许有什么东西,可以自动做到这一点,但我认为你的想法是我需要做的。RegularExpressionAttribute的想法似乎是我需要的东西,但它似乎不适合我。我只是想知道该属性是否会验证整个文本是URL还是在文本中查找URL。我猜是第一个选项,但我可能错了,因为它会在文本中查找URL。我将在我的答案中添加一个测试方法。我是用正则表达式方法完成的。它对我很有效。感谢您提供的仅删除web URI的支持。还必须添加文件、FTP、mailto、LDAP和其他方案—任何结束的前缀