Tag: 清理

在SQL Server中,如何通过SQL注入来避免单引号溢出的卫生问题?

为了解决这个问题,我很清楚参数化查询是最好的select,但是我在问什么使得我现在处于弱势的策略成为可能。 人们坚持下面的解决scheme不起作用,所以我正在寻找一个为什么它不会的例子。 如果在发送到SQL Server之前使用以下转义代码构builddynamicSQL,那么什么样的注入可以击败此? string userInput= "N'" + userInput.Replace("'", "''") + "'" 这里也回答了类似的问题,但我不相信任何答案都适用于此。 在SQL Server中不能使用“\”来转义单引号。 我相信SQL走私与Unicode( 这里概述)将被阻止的事实,即正在生产的string被标记为单引号之前的N的Unicode。 据我所知,没有其他字符集,SQL Server会自动转换为单引号。 没有一个没有转义的单引号,我不相信注射是可能的。 我不相信串截断也是一个可行的载体。 SQL Server肯定不会被截断,因为根据微软 , nvarchar的最大大小是2GB。 2 GB的string在大多数情况下是不可行的,在我的情况下是不可能的。 二次注射可能是可能的,但有可能的情况是: 所有进入数据库的数据都使用上述方法进行消毒 数据库中的值永远不会附加到dynamicSQL中(为什么要这样做呢?只要引用任何dynamicSQLstring的静态部分中的表值?)。 我并不是说这比使用参数化查询更好,或者是使用参数化查询的替代方法,但是我想知道我所概括的是如何易受攻击的。 有任何想法吗?

我可以通过用单引号转义单引号和周围的用户input来防止SQL注入吗?

我意识到参数化的SQL查询是构build包含用户input的查询时清理用户input的最佳方式,但是我不知道用户input和转义任何单引号以及用单引号包围整个string是什么问题。 代码如下: sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'" 用户input的任何单引号被replace为双单引号,这就消除了用户结束string的能力,所以他们可以input的任何内容,例如分号,百分号等都将是string的一部分,而不是实际上是作为命令的一部分执行的。 我们正在使用Microsoft SQL Server 2000,为此我认为单引号是唯一的string分隔符,也是唯一的方法来转义string分隔符,所以没有办法执行用户input的任何内容。 我看不出有什么办法对此发起SQL注入攻击,但是我意识到,如果这看起来像其他人可能已经想到的那样是无懈可击的,这将是常见的做法。 我的问题是:这个代码有什么问题? 有没有人知道通过这种消毒技术获得SQL注入攻击的方法? 使用这种技术的示例用户input将非常有帮助。 提前致谢。 更新: 感谢大家的回答; 我的研究中发现的所有信息几乎都出现在这个页面上,这表明那些忙于忙碌的日子里帮助我解决这个问题的人们的聪明才智和技巧。 我还没有接受任何答案的原因是,我仍然不知道有什么办法有效地发起这个代码的SQL注入攻击。 有些人build议反斜杠会转义一个单引号,而让另一个结束这个string,这样string的其余部分就会作为SQL命令的一部分被执行,而且我意识到这个方法可以将SQL注入一个mySQL数据库,但在MS SQL 2000中,唯一可以find的方法是转换单引号。 反斜杠不会这样做。 除非有办法停止单引号的转义,否则用户input的其余部分都不会被执行,因为它将被全部视为一个连续的string。 我明白,有更好的方法来消毒input,但我真的更感兴趣,了解为什么我上面提供的方法将无法正常工作。 如果有人知道任何具体的方式来对这个消毒方法进行SQL注入攻击,我很想看到它。

C#清理文件名

我最近一直在从各个地方把一堆MP3转移到一个存储库。 我一直在使用ID3标签构build新的文件名(谢谢,TagLib-Sharp!),我注意到我得到了一个System.NotSupportedException : “给定path的格式不被支持。” 这是由File.Copy()或Directory.CreateDirectory() 。 认识到我的文件名需要消毒没多久。 所以我做了明显的事情: public static string SanitizePath_(string path, char replaceChar) { string dir = Path.GetDirectoryName(path); foreach (char c in Path.GetInvalidPathChars()) dir = dir.Replace(c, replaceChar); string name = Path.GetFileName(path); foreach (char c in Path.GetInvalidFileNameChars()) name = name.Replace(c, replaceChar); return dir + name; } 令我惊讶的是,我仍然得到例外。 事实certificate,':'不在Path.GetInvalidPathChars()的集合中,因为它在path根中是有效的。 我想这是有道理的 – 但这是一个相当普遍的问题。 有没有人有一些短码清理path? 我已经提出了最彻底的,但它感觉可能是矫枉过正。 // […]