使用Javascript或C#防止SQL注入的最佳方法?

时间:2010-10-12 10:51:06

标签: c# javascript ajax sql-injection

我目前正在编写一个应用程序,它在前端使用ajax,在后端使用ASP.NET(C#)。

应用程序的一小部分对后端代码执行AJAX调用(从SQL数据库获取条目)

如何防止SQL注入JScript?

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

验证或转发输入的最佳方法是什么?

与PHP中的Add_Slashes()类似吗?

谢谢

丹尼尔

7 个答案:

答案 0 :(得分:14)

无论来电来自何处,都需要在服务器端进行SQL注入防护。

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

这也适用于AJAX调用:客户端不需要关闭JavaScript;他们只需要操纵他们从您的网站下载的Javascript代码进行虚假验证。

永远不要依赖客户端数据卫生。

答案 1 :(得分:12)

使用参数化查询,永远不构建SQL代码字符串。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

ajax调用不可避免地命中服务器,因此验证用户输入以避免sql注入攻击。

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

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

从不,EVER编写普通的sql字符串并将其传递给数据库,除非您明确使用参数化查询。

但是只需使用LINQ,您就可以保持自己(和您的客户!)的安全。

答案 4 :(得分:1)

使用绑定参数是阻止SQL注入的 方法:

http://use-the-index-luke.com/where-clause/bind-parameters

可以执行客户端验证以及,但只是提高可用性

答案 5 :(得分:0)

缺乏Javascript验证的安全性与Javascript可能被关闭的事实无关。

Javascript可能会被关闭意味着一个诚实的错误可能会出错,或导致默认的服务器消息而不是一个有用的消息。虽然他们可能会意外触发安全问题(我实际上是以用户身份执行此操作,但更糟糕的是我的输入是有效的,但其中一个名字我输入的人中有一个',更多关于此下面)。这会影响诚实但不完美的用户,而不是破解者。

一个破解者应该能够在大约30秒内重放具有不同值的AJAX请求,包括在另一个窗口中在社交媒体网站上制作愚蠢威胁的时间。这在技术上并不困难。这就是为什么Javascript验证没有安全价值,并且仅仅是为了使真实错误的验证更加用户友好(通过更直接的响应,并能够将焦点引导到不正确的字段)。

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

验证Javascript中明显错误的方法,以改善用户界面。

验证服务器上的明显错误,既是改进UI的手段,也是捕获攻击的手段。

以正确的方式将您的数据传递到其他图层。就SQL而言,这将意味着编码字符串分隔符(同样,'是最常见的情况,但某些数据库可能有其他分隔符),为此,最好的方法是通过一个库这样做为了你。在C#的情况下,这意味着将Parameters与ADO.NET一起使用而不是自己构建SQL(此外还有其他优点)。

答案 6 :(得分:0)

这里经常混合两个概念。验证和编码/转义。添加斜杠是尝试编码上下文的数据。验证是根据域确保数据有效。

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

所以下一部分是上下文感知编码。在SQL语句中粘贴数据时,需要转义/编码SQL。最简单,最安全的方法是使用参数化查询,处理所有内容。 更多信息:http://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

当数据被发送回客户端时,您需要转义/编码要返回数据的格式的数据。为了避免脚本注入,您需要知道是否在json-string内部进行转义,内部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