我有一个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,您可以购买一些高质量的玩具。”
答案 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);
参考: