小编Mar*_*sen的帖子

我可以在不抛出异常的情况下测试正则表达式在C#中是否有效

我允许用户输入正则表达式以匹配IP地址,以便在相关系统中进行IP过滤.我想验证输入的正则表达式是否有效,因为很多用户会弄乱op,尽管有良好的意图.

我当然可以在try/catch中做一个Regex.IsMatch(),看看它是否会爆炸,但有没有更智能的方法呢?速度不是一个问题,我只是宁愿避免无缘无故抛出异常.

c# regex

46
推荐指数
4
解决办法
3万
查看次数

HTML在存储或显示时编码用户输入

一直困扰我的简单问题.

我应该立即对用户输入进行HTML编码并将编码内容存储在数据库中,还是应该在显示时存储原始值和HTML编码?

存储编码数据可以大大降低开发人员在显示数据时忘记对数据进行编码的风险.但是,存储编码数据会使数据挖掘变得更加麻烦,并且会占用更多空间,即使这通常不是问题.

html security xss html-encode

30
推荐指数
4
解决办法
6262
查看次数

Cloudfront私有内容+签名网址架构

让我先简单介绍一下我正在考虑迁移到S3 + Cloudfront的系统架构.

我们在树中有许多实体订单.树的叶子有许多资源(具体的jpg图像),通常在20-5000的数量级,平均为~200.每个资源都有一个唯一的URL,通过我们今天的colo设置提供.

我可以将所有这些资源转移到S3,在此基础上设置Cloudfront并完成.如果我没有保护资源.

大多数实体是公共的(即约99%),其余的以多种方式(登录,IP,时间等)保护.一旦实体受到保护,所有资源也必须受到保护,并且只能在执行有效授权后才能访问.

我可以通过创建两个S3桶来解决这个问题 - 一个是私有,一个是公共.对于私人内容,我会在用户获得授权后生成签名的Cloudfront URL.但是,实体的状态可能会随意地从公共状态变为私有状态,反之亦然.系统管理员可能会在实体树的任何级别更改实体,从而导致整个树中的级联更改.一个变化可能导致~20k实体的变化,乘以200个资源,这将影响400万个资源.

我可以在后台监控状态更改中运行服务,但这很麻烦,更改400万个S3项目的ACL需要相当长的时间,而当发生这种情况时,我们要么会有未经保护的私有内容,要么公开内容我们必须生成签名的URL.

另一种可能性是默认情况下将所有资源设为私有.在对实体发出的每个请求中,我们将生成一个自定义策略,为该特定用户授予对实体中包含的所有资源的访问权限(通过在自定义策略中使用通配符URL).这需要为每个实体创建一个策略 - 这不会是一个问题.但是,这意味着我们的用户无法再缓存任何内容,因为每个新会话的URL都会更改.虽然对私人内容不是一个问题,但对于99%的公共实体而言,我们会放弃所有缓存.

另一种选择是将所有内容保密,并将上述方法用于私人实体.对于公共实体,我们可以为每个公共实体生成一个所有用户都可以共享的自定义策略.如果我们将生命周期设置为6小时并确保在5小时后生成新策略,则将确保用户的策略生命周期至少为一小时.这样做的好处是可以实现长达6小时的缓存,同时允许私有内容在状态更改后最多可以公开6个小时.这是可以接受的,但我不确定它是否值得(尝试计算当前请求的缓存/命中率).显然,我们可以调整5/6小时的边界以启用更长/更短的缓存,但代价是更长/更短的私有实体暴露.

有没有人部署类似的解决方案?我忽视的任何AWS功能都可能有用吗?一般的评论?

caching amazon-s3 amazon-web-services amazon-cloudfront

23
推荐指数
1
解决办法
8681
查看次数

为什么^*$匹配"127.0.0.1"

我不明白,为什么以下正则表达式:

^*$
Run Code Online (Sandbox Code Playgroud)

匹配字符串"127.0.0.1"?运用Regex.IsMatch("127.0.0.1", "^*$");

使用Expresso,它不匹配,这也是我所期望的.使用表达式^.*$确实匹配字符串,我也期望.

从技术上讲,^*$应该匹配字符串/行的开头任意次,然后是字符串/行的结尾.似乎*被隐含地视为一个.*

我错过了什么?

编辑:运行以下命令以查看问题的示例.

using System;
using System.Text.RegularExpressions;

namespace RegexFubar
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Regex.IsMatch("127.0.0.1", "^*$"));
            Console.Read();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我不希望有^*$匹配我的字符串,我想知道为什么它匹配.我认为该表达式应该导致抛出异常,或者至少是不匹配.

编辑2:清除任何混乱.我没有写这个正则表达式,意图让它匹配"127.0.0.1".我们的应用程序的用户输入了表达式,并想知道为什么它不应该匹配字符串.看了之后,我无法解释为什么它匹配 - 特别是因为Expresso和.NET似乎不同地处理它.

我想这个问题是由于.NET实现避免抛出异常而得到回答,甚至认为它在技术上是一个不正确的表达式.但这真的是我们想要的吗?

c# regex

9
推荐指数
2
解决办法
1018
查看次数

Queryable.Single上的IndexOutOfRangeException

我有一个ASP.NET网站已经运行了很长时间,最近没有任何改变.从一小时到下一小时,我开始在一行中接收一个IndexOutOfRangeException,我在这里执行LINQ查询:

var form = SqlDB.GetTable<ORMB.Form, CDB>()
    .Where(f => f.FormID == formID)
    .Single();
Run Code Online (Sandbox Code Playgroud)

ORMB.Form是一个POCO对象,LINQ to SQL属性将其映射到MSSQL表(映射验证为正确).堆栈跟踪如下:

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at System.Collections.Generic.List`1.Add(T item)
   at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)
   at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
   at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
   at System.Linq.Queryable.Single[TSource](IQueryable`1 source)
   at GetForm.Page_Load(Object sender, EventArgs e)
Run Code Online (Sandbox Code Playgroud)

反映System.Collections.Generic.List.Add显示以下代码:

public …
Run Code Online (Sandbox Code Playgroud)

c# linq

7
推荐指数
1
解决办法
2611
查看次数

IL优化尝试导致执行速度变慢

考虑这更多是一个学术问题,而不是实际问题.

在重新创建一个轮子,即编写一个迷你ORM /类型映射器时,我发出了一些IL来将对象的属性转换为添加到SqlCommand的SqlParameters.

我的第一次尝试基本上是编写C#代码并将其转换为IL 1:1,从而产生以下代码(完美无缺地工作).请注意,注释表示运行以下发出的IL后的堆栈:

int paramLocIndex = localIndex++;

 // Get the type handler [typeHandler]
il.Emit(OpCodes.Call, ClrTypeHandlers[prop.PropertyType].GetType().GetMethod("GetTypeHandler", BindingFlags.NonPublic | BindingFlags.Static));

// Load the object [typeHandler, object]
il.Emit(OpCodes.Ldloc_0);

// Get the property value [typeHandler, value]
il.Emit(OpCodes.Call, prop.GetMethod);

// Box the value [typeHandler, boxedValue]
il.Emit(OpCodes.Box, prop.PropertyType);

// Let the type handler create the param [param]
il.Emit(OpCodes.Callvirt, typeof(SqlTypeHandler).GetMethod("CreateParamFromValue", BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(object) }, null));

// Store the parameter as a variable []
il.DeclareLocal(typeof(SqlParameter));
il.Emit(OpCodes.Stloc, paramLocIndex);

// Load the parameter again …
Run Code Online (Sandbox Code Playgroud)

c# optimization il

3
推荐指数
1
解决办法
187
查看次数