11

昨天我和一位开发人员交谈,他提到了一些关于限制数据库字段插入的内容,比如字符串,如--(减号)。

在同一类型中,我知道这是转义 HTML 字符(如 等)的好方法<>不是--。这是真的?我需要担心--++?它更像是一个神话还是古老的东西?


更新

非常感谢所有答案,这样很容易理解,因为我对这一切都很陌生。好吧,更具体地说,在这种情况下,我们的讨论是关于我们正在开发的 C# ASP.NET MVC 网站,所以那里有一个复杂的开户表单,其中包含重要信息,所以我不确定 MVC 是否使用 Linq与数据库的接口是否已经带有这种保护。因此,如果有人可以提供一些关于它的提示,那就太好了。再次感谢

4

6 回答 6

9

避免 SQL 注入攻击的正确方法不是简单地禁止某些有问题的字符,而是使用参数化 SQL。简而言之,参数化 SQL 会阻止数据库执行原始用户输入作为 SQL 命令的一部分,这会阻止执行像“drop table”这样的用户输入。只是转义字符并不能阻止所有形式的 SQL 注入攻击,并且排除某些单词(例如“Drop”)并非在所有情况下都有效;在某些字段中,“Drop”是数据输入的完全有效部分。

你可以在这里找到一些关于参数化 SQL 主题的好文章:

https://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/

http://www.codeproject.com/KB/database/ParameterizingAdHocSQL.aspx

既然您提到您正在使用 ASP.net,我可以为您提供一些专门处理 ASP 中的 SQL 注入的链接。

https://dzone.com/articles/aspnet-preventing-sql-injectio https://www.c-sharpcorner.com/UploadFile/75a48f/how-sql-injection-can-be-possible-in-asp-net -网站/

这是一篇关于使您的 ASP 更安全的更一般的文章:http: //www.codeproject.com/KB/web-security/Securing_ASP_NET_Apps.aspx

当然还有关于 SQL 注入的 MSDN 文章:http: //msdn.microsoft.com/en-us/library/ms998271.aspx

于 2010-02-04T14:29:03.017 回答
6

SQL 注入对于大多数允许用户将参数注入在数据库上执行的语句中的网站来说是一种高安全风险。

一个简单的例子是:

输入字段“姓名:_________

"SELECT * FROM tblCustomer WHERE Name = '" + nameInputField + "'"

所以如果我输入“Bob”,我们有

"SELECT * FROM tblCustomer WHERE Name = 'Bob'"

但是如果我输入“'; DROP TABLE tblCustomer”,我们最终会得到更险恶的结果

"SELECT * FROM tblCustomer WHERE Name = ''; DROP TABLE tblCustomer"

有很多方法可以避免这些问题,而且很多方法都内置在您使用的任何语言中 - 因此,与其考虑所有狡猾的可能性“;”、“--”、“/*”等,不如尝试使用一些已经存在。

大声说出您使用的语言,我相信我们可以告诉您如何避免这些攻击。

于 2010-02-04T14:25:01.087 回答
3

他说的是SQL 注入攻击,正如他所说的那样。

问题不在于数据库中存在此类数据,而在于将输入数据直接传递到数据库而不对其进行清理。

如果不清理它,如果有人传入一个以 a 结尾的字符串,那么;他们可以在其后面加上任何他们想要的东西(select * from sys.objects例如)或更恶意的东西,比如删除一些表。

很难完全防范,但是如果您从代码中使用良好的数据库库并遵循已知做法,例如使用参数化查询,您可以限制可能的损害。

尽可能多地存储--在数据库中,但不要在不经过清理过程的情况下将其传递到数据库(这是一个好的数据库库至关重要的地方——它应该清理引号和其他可能有害的输入)。

于 2010-02-04T14:18:41.973 回答
3

--插入包含在数据库中的字符串并没有什么“危险” 。

在数据库表中插入直接来自用户输入的任何内容而不对其进行处理是很危险的,否则您将面临SQL 注入攻击。示例:编码员让用户在字段中输入他们的姓名,然后用户输入:

Joe '); drop table users; commit transaction; --

然后编码器将其放入他们的 MySQL 数据库中,如下所示:

conn.execute("insert into users (username) values ('" + userInput + "')");

繁荣用户已经删除了用户表(假设数据库登录有权这样做,它不应该这样做 - 但这是一个不同的主题),因为编码器没有确保来自用户的字符串被正确转义,所以它被直接发送到数据库引擎,攻击者笑得很开心。:-)

使用您的环境提供的任何工具来确保正确转义字符串。例如,JDBC 为此使用PreparedStatement该类。大多数环境都会有类似的东西。

于 2010-02-04T14:23:55.647 回答
3

使用参数化查询。这些查询将变量表示为 SQL 中的占位符,例如select * from person where name = ?. 创建 SQL 查询后,您可以在查询中设置参数值。参数化查询确保替换占位符的任何内容都不会被视为 SQL 语句的一部分。

请参阅Jeff Atwood 的文章,以获得对参数化查询的一个很好的概述。

于 2010-02-04T14:24:54.517 回答
1

只要您在执行 INSERT/UPDATE/... 时正确转义数据,这并不危险

并且转义 HTML 字符不是一个好方法。想象一下,您编写了一个转义此类字符的函数,并且您在数据库中存储了一些转义文本。然后你注意到你的函数没有转义'<',所以你改变了函数......现在数据库中已经存在的记录会发生什么?- 他们的 '<' 字符将保持未转义。因此,在将文本存储到数据库之前永远不要转义文本(当然是转义 SQL 查询)。转义应该发生在 HTML/XML/... 页面从文本中产生时,即从数据库中查询到原始文本之后!

于 2010-02-04T14:40:03.770 回答