2010-10-12 63 views
3

我目前正在编写一个应用程序,它在前端使用ajax,在后端使用ASP.NET(C#)..使用Javascript或C#防止SQL注入的最佳方法?

小部分应用程序对后端代码执行AJAX调用来自SQL数据库的条目)

如何防止JScript注入的SQL?

我知道用javascript验证通常是不安全的,因为javascript可以关闭,但因为这是一个AJAX调用,所以如果用户关闭了javascript,AJAX将永远不会运行。

什么是验证或转义输入的最佳方式?

像PHP中的Add_Slashes()?

感谢

丹尼尔

+0

我想说的是,使用SQL * *参数在SQL命令(也可以让你避免连接包含来自用户的数据的SQL语句部分)应该删除大部分问题。 – 2010-10-12 10:53:38

回答

11

使用参数化查询,从不建立SQL代码字符串。

+1

请在答案中提供更多细节,解释会很好。 – icedwater 2015-07-27 08:20:41

+1

@icedwater,代码中参数的参数化方式取决于服务器上使用的语言,数据库服务器和框架。问题中的信息太少,无法在此处给出一个很好的示例(它仅将C#指定为语言,但不包含有关数据库或数据访问框架的信息)。 – Lucero 2015-07-27 12:27:48

+0

我同意,但我想即使是一个简单的例子来说明如何参数化查询在这里会有所帮助。没关系。这是一个小问题。 – icedwater 2015-07-27 14:29:50

14

防护SQL注入需要,即呼入电话来自于发生在服务器端,而不管。

基于Javascript的卫生方法总是没用,因为Javascript运行在客户端,因此可以伪造。

这也适用于AJAX调用:客户端不需要关闭JavaScript;他们只需要操纵他们从你的网站上下载的Javascript代码来伪造验证。

永远不会依靠客户端数据卫生。

+1

是的,操纵,甚至更容易,完全绕过。你也可以在你的网站上放置文字,只是要求你的用户很好,而不是试图破解你的网站。 – 2010-10-12 10:55:07

+0

谢谢!真正有用的信息.. – 2010-10-12 11:16:34

2

我认为使用参数化查询而不是专用SQL

+0

请在您的答案中提供更多详细信息,解释会很好。 – icedwater 2015-07-27 08:20:57

1

无论你做什么,你都必须在服务器上运行验证码。

ajax调用不可避免地会碰到服务器,因此验证用户输入以避免SQL注入攻击。

在客户端验证用户输入的唯一原因是为了避免对服务器的调用,例如用户没有填写必填字段。

在服务器上,如果使用LINQ to SQL或实体更新数据库,则可以免费获得参数化查询以避免SQL注入攻击。

从不,永远不会写出纯SQL字符串并将其传递给数据库,除非您明确使用参数化查询。

但只是使用LINQ,你会保持自己(和你的客户!)安全。

0

Javascript验证缺乏安全性与JavaScript可能关闭无关。

JavaScript可能被关闭意味着一个诚实的错误可能会做错事,或导致默认的服务器消息,而不是一个有用的。虽然他们可能意外触发了一个安全问题(我实际上是以用户的身份完成这项工作的,但最糟糕的是我的输入是有效的,但我输入的其中一个人的名字中有一个',更多内容见下文)。这影响了诚实但不完美的用户,而不是饼干。

一个黑客应该能够在大约30秒内以不同的值重播一个AJAX请求,其中包括在另一个窗口中在社交媒体网站上做出愚蠢威胁的时间。这在技术上并不困难。这就是为什么Javascript验证没有安全价值的原因,并且仅仅是为了验证对于诚实的错误更加用户友好(通过具有更直接的响应并且能够将焦点指向不正确的字段)。

此外,这通常不是验证问题,而是编码问题。有些人试图通过禁止可能导致它们的序列来“修复”SQL注入攻击,这通常意味着禁止撇号字符。然后他们把这个逻辑放到合理包含撇号的字段上。特别是,绝对不要使用名称字段来做这件事;人们真的不喜欢被告知他们的名字是“错误的”,并且更糟糕的是,他们可能会感觉到种族主义或文化不敏感,因为你会发现他们很多。法国或爱尔兰的名字,但不常用英文或德文的名字(是的,我知道诺曼起源的英文名字通常有它们,但我也听到有名字的撇号人在他们的名字中咆哮愚蠢的种族主义网站,不会让他们输入他们的名字是正确的,这可能是提出诺曼人作为纠正的最坏时期)。

验证在JavaScript中显然错误作为改进UI的手段。

验证服务器上显然是错误的,作为改进UI的手段和捕获攻击的方法。

以正确的方式将您的数据传递给其他图层。在SQL方面,这意味着编码字符串分隔符(再次,'是最常见的情况,但对于某些数据库可能还有其他一些分隔符),对此,最好的方法是通过一个库来完成。在C#的情况下,这意味着使用ADO.NET使用Parameters,而不是自己构建SQL(这也有其他优点)。

0

这里经常混淆两个概念。验证和编码/转义。添加斜线是为上下文编码数据的尝试。验证是关于根据域确定数据是否有效。

要回答你的问题,避免这些问题的最佳方法是双重的。首先验证服务器端的数据(确保一个数字的确是一个数字等)。然而,验证不足以避免这些问题。名称“O'Brian”是一个有效名称的例子,所以它会通过验证,但它可能会导致JavaScript或SQL语句中的问题。

所以下一部分是上下文感知编码。将数据粘贴到SQL语句中时,需要对SQL进行转义/编码。做到这一点的最简单和最安全的方法是使用参数化查询,其中一切都为您处理。 更多信息:http://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

当数据被发送回客户端,你需要逃出/编码数据在要返回的数据格式,以避免脚本注入,你需要知道,如果你是逃避里面。一个json字符串,一个HTML属性等等。看到这里了解如何逃脱的不同的上下文信息:http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet 使用AntiXSS转义/编码网页:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=f4cd231b-7e06-445b-bec7-343e5884e651