数据库是一种信息的集合,其组织方式允许计算机程序快速轻松地访问数据(甚至大量)。 数据库中的数据被组织成表格,表格中包含记录/行字段。 一个字段包含程序使用的实际数据。
关系数据库管理系统(RDBMS或有时只是DBMS)使用户能够访问和操纵数据库中的数据。 它们还用于运行报告和分析工具。 系统管理员使用它们来保护和维护数据库。 一些常见的RDBMS包括MySQL,Oracle和MS-SQL。
SQL代表结构化查询语言(通常发音为
续集 )。 它是用于向RDBMS发出命令以检索或操纵数据的语言。 也可以发出这些命令来操纵数据库结构本身。 SQL注入攻击利用应用程序代码部分中的安全漏洞,这些安全漏洞负责从用户那里获取输入并将其作为SQL字符串的一部分发送到RDBMS。为了存储数据库中的信息或从数据库中检索信息,应用程序可以动态创建要作为查询发布的SQL字符串。 SQL字符串由RDBMS编译,然后作为命令执行。 例如,SQL字符串“ SELECT * FROM AddressBook WHERE FirstName ='John'”将导致RDBMS从名为AddressBook的表中返回所有具有FirstName字段且值为'John'的记录。
可能是从用户请求了一个名字,然后将其添加到字符串中以创建所需的完整SQL字符串。 例如。 如果提示用户输入名字,然后将其放入字符串中,则该字符串将构建为:
"SELECT * FROM AddressBook WHERE [FirstName]='" + {first name from user here} + "'"
当用户在应用程序中输入SQL命令而不是预期值时,就会发生SQL注入攻击。
例如,在这种情况下,当程序提示用户输入名字的值时,他们可能会输入类似:
a'; DELETE * FROM [OverduePayments] WHERE [AccountNo]='MyAccountNo';
这可以确保银行系统忘记您所有的逾期抵押付款。
当应用程序根据用户的输入创建SQL字符串以访问数据库时,用户的SQL命令将随之插入。
然后,RDBMS将此结果SQL字符串编译为命令并执行它。
这导致恶意用户的命令与合法应用程序命令一起执行,从而允许恶意用户不受限制地访问数据库。
为了保护您的应用程序免受这种形式的攻击,应用程序应该在执行任何查询之前对所有用户输入实施强力验证。 另外,应删除可能在SQL查询创建中使用的所有数据中的有害SQL命令。 只需删除数据中的所有引号即可删除有害SQL命令的用户输入。 当在SQL字符串中使用时,文字文本值(在此示例中用户要求的内容)用引号引起来。 通常,这仅指单引号('),但是大多数版本的Access都会很高兴使用双引号(“)。因此,建议在尝试使用输入中的所有引号将其形成形式之前,将其删除。 SQL字符串,在输入中不带引号的情况下,都将被视为数据,因此非常安全。
防止此类攻击的另一种方法是利用存储过程。 存储过程是驻留在RDBMS中的预编译SQL命令。 当程序以SQL字符串的形式向RDBMS提供SQL查询时,在执行该SQL之前,RDBMS首先将其编译为命令。 存储过程已被编译,因此使用较少的资源; 但更重要的是,注入的SQL不会被编译成为SQL指令的一部分(它保留在SQL中,但只是作为数据)。 存储过程还提供了额外的安全性,因为可以进一步限制数据库用户使用特定的存储过程。
Chapple,M.(2007年)。 SQL Server存储过程。From: https://bytes.com/topic/access/insights/864109-sql-injection-attack
SQL注入攻击防范
106

被折叠的 条评论
为什么被折叠?



