在线业务的人都不想冒数据库受到损坏的风险。接下来,我们将介绍一些实用的办法,你可以利用这些办法来保护MySQL数据库,以便加强网站的安全性。
二 保护 *** 作系统
确保 *** 作系统的安全是保护数据库安全的前提,因为如果整个运行环境不安全,那么网站上所有的东西都脆弱,很容易暴露于攻击者。为了维护 *** 作系统和MySQL服务器,你可以使用以下方法:
2.1 主机数据库服务器和web服务器分别在不同的物理机器上,如果可能,在一个单独的服务器上运行数据库服务器,以预防由其他应用程序或服务的漏洞造成的服务器问题。
安装杀毒软件,防火墙以及所有推荐的补丁和更新,防火墙能有效地把流量过滤到MySQL服务器。为了更好的提高安全性,你还可以实行入口封锁。
禁用所有不必要的服务,而且这样的服务越少越好。
2.2 保护所有帐户和密码
攻击者侵入MySQL数据库最常见的一种方法是窃取有安全隐患的账户信息。为了降低出现这种风险的可能性,你不妨试一试下面的方法:
2.2.1. 给所有MySQL账户设置密码
客户程序并不是每次都能识别用户,因此,如果用户知道数据库名但是没有这个用户名的密码,那他可以指定任何其他用户名连接到MySQL数据库。让每个MySQL用户名都设置密码,这样一来,要想利用匿名账户建立连接将会变得很困难。
2.2.2. 不要使用根用户运行MySQL服务器
在安装MySQL的时候,默认情况下创建了一个命名为“root”的管理用户。每个人都知道这一点,所以攻击者通常试图侵入这个“root”用户来获取访问权限。为了保障这个重要帐户的安全,你需要给它重新命名,然后更改一个长并且复杂的密码。
2.2.3你可以在MySQL控制台使用mysql>RENAME USER root TO new_username
指令给根用户重命名,使用mysql>SET PASSWORD FOR 'username'@'%hostname' =
PASSWORD('newpassword')//这是很重要的一条命令
指令来修改密码。
三. 减少管理员账户
管理员账户越多,风险越大,所以你应该保持尽可能最少的帐户数量,只有为那些真正需要它的人创建账户。此外,记得要删除未使用的和匿名的账户。如果你有很多管理员账户,那你需要定期检查并清理那些不必要的账户。
四. 加强所有的密码
除了管理员帐户,你还需要加强所有其他用户的密码。你可以检查所有的用户名和密码,必要的时候你还可以重置安全强度低的账户密码。虽说这样做会有点费时,但却是有必要的。
五 限制数据库权限
每个用户都应该被授予适当的权限以便数据库能够正常运行,但这样一来也加大了数据库的安全隐患。就数据库权限而言,我们有以下几点建议:
5.1. 不要授予非管理员用户文件/高级/程序权限
文件,高级和程序权限都不应该被滥用。文件权限让用户可以在文件系统中的任何一个地方编写文件,而程序权限让用户在任何时候都能够查看服务器活动,终止客户端连接甚至更改服务器 *** 作。为了你的数据库安全,这些权限只能授予给管理员账户。
5.2. 限制或禁用显示数据库权限
显示数据库特权可以用于收集数据库信息,所以攻击者通常利用它来窃取数据并准备进一步攻击。你应该把这个权限授予那些真正需要的人,或者直接禁用这个权
限,你只需要把skip-show-database添加到MySQL数据库中的/etc/my.cnf配置文件中。对于Windows *** 作系统来说,则
需要添加到my.ini文件中。
5.3. 限制管理员和所有其他用户的权限
即使是管理员,也不要在同一账户中授予所有权限。因此我们建议你最好降低管理员账户访问数据的权限。至于其他的用户,你最好检查所有他们拥有的权限,以确保一切都是合适的。
六 删除风险组件
MySQL数据库的默认配置有一些不必要的组件,你可以考虑以下建议:
6.1. 禁用LOAD DATA LOCAL INFILE指令
这个命令允许用户读取本地文件甚至访问其他 *** 作系统上的文件,这可能帮助攻击者收集重要的信息并利用应用程序的漏洞侵入你的数据库。你需要做的是把set-variable=local-infile=0插入到MySQL数据库的my.cnf文件中,来禁用这个指令。
6.2. 删除测试数据库
有一个默认的“测试”数据库用于测试目的。由于这个数据库有安全风险,匿名用户也可以访问,你应该使用mysql>DROP database test指令尽快把它清除掉。
6.3. 删除历史文件
MySQL服务器有一个历史文件,它可以帮助你在安装出错的时候找到问题所在。历史文件包含敏感信息,比如说密码,如果这些信息被攻击者获得,那么将会给
你的数据库带来巨大的安全隐患。在安装成功后,历史文件并没有什么用,因此你可以使用cat /dev/null >
~/.mysql_history指令来删除文件当中的内容。
七 限制远程访问MySQL服务器
对于大多数用户来说,不需要通过不安全的开放网络来访问MySQL服务器。你可以通过配置防火墙或硬件,或者迫使MySQL只听从localhost来限制主机。此外,需要SSH隧道才能进行远程访问。
八 如果你想仅仅从本地主机来限制用户建立连接,你需要在在配置文件中添加bind-address=127.0.0.1。
8.1利用日志记录
启用日志记录让你可以检测服务器上的活动,这样你就可以分析失败的登录尝试和敏感文件的访问记录,以便了解是否存在向你的服务器和数据库发起的恶意活动。
你只需要把log =/var/log/mylogfile指令添加到MySQL配置文件中,就可以手动启用日志记录功能。
8.2至于日志记录,需要注意以下两点:
8.2.1日志记录仅适用于查询数量有限的数据库服务器。对于信息量大的服务器,这可能会导致高过载。
8.2.2由于“hostname.err”文件包含敏感数据表名和密码,只有“root”和“mysql”才有访问和记录这个文件的权限。
1.没有正确过滤转义字符 在用户的输入没有为转义字符过滤时,就会发生这种形式的注入式攻击,它会被传递给一个SQL语句。这样就会导致应用程序的终端用户对数据库上的语句实施 *** 纵。比方说,下面的这行代码就会演示这种漏洞: statement := "SELECT * FROM users WHERE name ='" userName "'" 这种代码的设计目的是将一个特定的用户从其用户表中取出,但是,如果用户名被一个恶意的用户用一种特定的方式伪造,这个语句所执行的 *** 作可能就不仅仅是代码的作者所期望的那样了。例如,将用户名变量(即username)设置为: a' or 't'='t,此时原始语句发生了变化: SELECT * FROM users WHERE name = 'a' OR 't'='t'如果这种代码被用于一个认证过程,那么这个例子就能够强迫选择一个合法的用户名,因为赋值't'='t永远是正确的。 在一些SQL服务器上,如在SQL Server中,任何一个SQL命令都可以通过这种方法被注入,包括执行多个语句。下面语句中的username的值将会导致删除“users”表,又可以从“data”表中选择所有的数据(实际上就是透露了每一个用户的信息)。 a'DROP TABLE usersSELECT * FROM data WHERE name LIKE'% 这就将最终的SQL语句变成下面这个样子: SELECT * FROM users WHERE name = 'a'DROP TABLE usersSELECT * FROM DATA WHERE name LIKE '%'其它的SQL执行不会将执行同样查询中的多个命令作为一项安全措施。这会防止攻击者注入完全独立的查询,不过却不会阻止攻击者修改查询。2.Incorrecttype handling 如果一个用户提供的字段并非一个强类型,或者没有实施类型强制,就会发生这种形式的攻击。当在一个SQL语句中使用一个数字字段时,如果程序员没有检查用户输入的合法性(是否为数字型)就会发生这种攻击。例如: statement := "SELECT * FROM data WHERE id = " a_variable "" 从这个语句可以看出,作者希望a_variable是一个与“id”字段有关的数字。不过,如果终端用户选择一个字符串,就绕过了对转义字符的需要。例如,将a_variable设置为:1DROP TABLEusers,它会将“users”表从数据库中删除,SQL语句变成:SELECT * FROM DATA WHERE id = 1DROP TABLE users
3.数据库服务器中的漏洞 有时,数据库服务器软件中也存在着漏洞,如MYSQL服务器中mysql_real_escape_string()函数漏洞。这种漏洞允许一个攻击者根据错误的统一字符编码执行一次成功的SQL注入式攻击。
4.盲目SQL注入式攻击 当一个Web应用程序易于遭受攻击而其结果对攻击者却不见时,就会发生所谓的盲目SQL注入式攻击。有漏洞的网页可能并不会显示数据,而是根据 注入到合法语句中的逻辑语句的结果显示不同的内容。这种攻击相当耗时,因为必须为每一个获得的字节而精心构造一个新的语句。但是一旦漏洞的位置和目标信息的位置被确立以后,一种称为Absinthe的工具就可以使这种攻击自动化。
5.条件响应 注意,有一种SQL注入迫使数据库在一个普通的应用程序屏幕上计算一个逻辑语句的值: SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd'AND 1=1 这会导致一个标准的面面,而语句 SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd'AND 1=2在页面易于受到SQL注入式攻击时,它有可能给出一个不同的结果。如此这般的一次注入将会证明盲目的SQL注入是可能的,它会使攻击者根据另外一个 表中的某字段内容设计可以评判真伪的语句。
6.条件性差错 如果WHERE语句为真,这种类型的盲目SQL注入会迫使数据库评判一个引起错误的语句,从而导致一个SQL错误。例如: SELECT 1/0 FROM users WHERE username='Ralph'。显然,如果用户Ralph存在的话,被零除将导致错误。
7.时间延误 时间延误是一种盲目的SQL注入,根据所注入的逻辑,它可以导致SQL引擎执行一个长队列或者是一个时间延误语句。攻击者可以衡量页面加载的时间,从而决定所注入的语句是否为真。 以上仅是对SQL攻击的粗略分类。但从技术上讲,如今的SQL注入攻击者们在如何找出有漏洞的网站方面更加聪明,也更加全面了。出现了一些新型的SQL攻击手段。黑客们可以使用各种工具来加速漏洞的利用过程。我们不妨看看theAsprox Trojan这种木马,它主要通过一个发布邮件的僵尸网络来传播,其整个工作过程可以这样描述:首先,通过受到控制的主机发送的垃圾邮件将此木马安装到电脑上,然后,受到此木马感染的电脑会下载一段二进制代码,在其启动时,它会使用搜索引擎搜索用微软的 ASP技术建立表单的、有漏洞的网站。搜索的结果就成为SQL注入攻击的靶子清单。接着,这个木马会向这些站点发动SQL注入式攻击,使有些网站受到控制、破坏。访问这些受到控制和破坏的网站的用户将会受到欺骗,从另外一个站点下载一段恶意的JavaScript代码。最后,这段代码将用户指引到第三个站点,这里有更多的恶意软件,如窃取口令的木马。 以前,经常有人警告或建议Web应用程序的程序员们对其代码进行测试并打补丁,虽然SQL注入漏洞被发现和利用的机率并不太高。但近来攻击者们越来越多地发现并恶意地利用这些漏洞。因此,在部署其软件之前,开发人员应当更加主动地测试其代码,并在新的漏洞出现后立即对代码打补丁。
如果你是一个开发者,那么你需要:
1.使用参数化的过滤性语句 要防御SQL注入,用户的输入就绝对不能直接被嵌入到SQL语句中。恰恰相反,用户的输入必须进行过滤,或者使用参数化的语句。参数化的语句使用参数而不是将用户输入嵌入到语句中。在多数情况中,SQL语句就得以修正。然后,用户输入就被限于一个参数。下面是一个使用Java和JDBC API例子: PreparedStatement prep =conn.prepareStatement("SELECT * FROM USERS WHERE PASSWORD=?")prep.setString(1, pwd)总体上讲,有两种方法可以保证应用程序不易受到SQL注入的攻击,一是使用代码复查,二是强迫使用参数化语句的。强迫使用参数化的语句意味着嵌入用户输入的SQL语句在运行时将被拒绝。不过,目前支持这种特性的并不多。如H2 数据库引擎就支持。
2.还要避免使用解释程序,因为这正是黑客们借以执行非法命令的手段。
3.防范SQL注入,还要避免出现一些详细的错误消息,因为黑客们可以利用这些消息。要使用一种标准的输入确认机制来验证所有的输入数据的长度、类型、语句、企业规则等。
4.使用专业的漏洞扫描工具。但防御SQL注入攻击也是不够的。攻击者们目前正在自动搜索攻击目标并实施攻击。其技术甚至可以轻易地被应用于其它的Web架构中的漏洞。企业应当投资于一些专业的漏洞扫描工具,如大名鼎鼎的Acunetix的Web漏洞扫描程序等。一个完善的漏洞扫描程序不同于网 络扫描程序,它专门查找网站上的SQL注入式漏洞。最新的漏洞扫描程序可以查找最新发现的漏洞。
5.最后一点,企业要在Web应用程序开发过程的所有阶段实施代码的安全检查。首先,要在部署Web应用之前实施安全测试,这种措施的意义比以前更大、更深远。企业还应当在部署之后用漏洞扫描工具和站点监视工具对网站进行测试。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)