阻止用户在表单中输入 URL

Prevent user from entering URL in form

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

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

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

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

到目前为止,我没有任何具体的代码可以展示。我对一般情况感兴趣,所以如果它对您有帮助,您可以想象一个普通的 CRUD 表单(来自 VS 生成的表单)。

感谢任何帮助。

此致, 艾哈迈德

== 编辑 == 可能我不够清楚。我有兴趣查看用户输入的文本中是否包含一个或多个 URL。如果该文本中有任何 URL 将其删除,以某种方式使其无效或给出验证错误。因此,如果用户输入此文本:

"Here you can find some crazy deals - http://crazydeals.com/notsocrazydeals and you can buy some high quality toys"

要么转向这个:

"Here you can find some crazy deals - and you can buy some high quality toys"

或这个

"Here you can find some crazy deals - h t t p : / / c r a 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 and you can buy some high quality toys"

您可以创建自己的验证器并按如下方式验证:

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, "");

您还可以使用 RegularExpressionAttribute 使基于模式的模型输入无效。这样的属性在客户端和服务器端都会失效。

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.");
}