阻止用户以格式

时间:2019-11-15 11:56:59

标签: c# asp.net-core asp.net-core-3.0

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

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

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

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

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

感谢您的帮助。

最好的问候, 艾哈迈德

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

  

“在这里您可以找到一些疯狂的交易-http://crazydeals.com/notsocrazydeals,您可以购买一些高质量的玩具”

要选择这个:

  

“在这里您可以找到一些疯狂的交易-您可以购买一些高质量的玩具”

或这个

  

“在这里您可以找到一些疯狂的交易-h t t p:/ / c r a   z y d a ls。 c / m / n o t s o c r a z y d a l s,您可以购买一些高质量的玩具。”

2 个答案:

答案 0 :(得分:1)

正则表达式是解决此问题的最佳方法,也许使用“ 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.");
}

答案 1 :(得分:0)

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

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

参考:

How to check whether a string is a valid HTTP URL?