已经找到“” 的记录517条
什么是SQL注入攻击?如何保护和识别攻击

SQL注入是最常见的网络攻击类型之一。不幸的是,SQL注入也是应用程序可能面临的最具破坏性的威胁之一。这些攻击通常会导致数据丢失,对于具有共享数据库的基础架构尤其危险。

本文介绍了如何防止SQL注入。继续阅读以了解什么是SQL注入,这些攻击如何工作以及公司采取了哪些步骤来保护其数据库免受恶意注入。

什么是SQL注入攻击?

SQL注入(SQLi)是一种网络攻击,黑客在其中通过应用程序运行恶意SQL语句来操纵数据库。这些攻击可能会影响依赖SQL数据库(MySQL,Oracle,Sybase,Microsoft SQL Server,Access,Ingres等)的任何网站或Web应用程序。

SQLi的后果从轻度到严重不等。注入后,黑客可以:

损坏,窃取或删除数据。
获得对系统的root访问权限。
创建新记录,为更高级的突破(例如APT攻击)打开大门。
提升特权以访问网络上的其他应用程序和系统。
损害服务器或其他后端基础结构。
发起DDoS(拒绝服务)攻击。
通过数据库服务器访问操作系统。
损害程度取决于攻击者的能力。从几个数据库错误到Web服务器的完全接管,受害者可能会遇到任何事情。

SQL注入如何工作?
大多数Web应用程序要求用户提供凭据以证明其身份和访问级别。如果经过验证的用户请求数据,则应用程序将以查询的形式向数据库发送一条SQL语句,并返回所请求的数据。

当应用程序具有SQLi漏洞时,黑客可以跳过身份验证过程,并手动将SQL语句(或恶意有效负载)注入数据库中。数据库无法识别威胁,并像应用程序正在发送请求一样执行语句。

与某些类型的网络攻击不同,SQL注入要求目标系统具有可利用的漏洞。大多数缺点是由于程序代码和用户提供的输入之间缺乏严格的分隔。

黑客通常通过应用程序或网站来瞄准数据库。但是,一些更复杂的攻击直接发生在数据库之后。

SQL注入类型
有两种SQL注入:

经典的SQLi:攻击是黑客将命令发送到数据库并从输出中收集结果。
盲目的SQLi:黑客在其中散发命令,将命令发送到数据库,但不直接从输出中收集结果。
以下是企业可以面对的七种最常见的SQL注入类型。

带内SQLi(经典SQLi)
当黑客使用相同的通信渠道发起攻击并收集结果时,就会发生带内SQLi。这是WordPress代码中的带内注入漏洞的示例:

全局$ wpdb;

$ title = $ wpdb-> get_var(“从”。$ wpdb-> posts。“中选择post_title,其中ID =”。$ _GET ['id']);

回声$ title;
该代码具有SQLi弱点,因为用户输入$_GET[‘id’]直接进入数据库。没有清理或转义,因此攻击者可以将命令直接发送到数据库,然后将输出接收回浏览器。例如,黑客可以发送:

SELECT 从数据库检索记录的命令。
INSERT 创建新用户帐户的命令。
UPDATE 修改现有记录的命令。
带内SQLi是最常见的SQL注入类型。

基于错误的SQLi
基于错误的SQLi是一种依赖于错误消息的带内注入技术。黑客反复调查应用程序是否存在错误,以收集有关数据库结构的信息。

基于错误的SQL注入使攻击者可以从可见错误中检索表名称和内容之类的数据。在某些情况下,基于错误的SQL注入足以使黑客枚举整个数据库。

基于联合的SQLi
基于联合的SQLi是带内注入,它利用了UNIONSQL运算符的漏洞。

该UNION命令将执行一个或多个其他SELECT查询,并将结果附加到原始查询中。攻击者可以利用扩展结果从数据库中的其他表中检索数据。

基于联合的SQLi仅在原始查询和新查询具有相同的列数和数据类型时才有效。

推理SQLi(盲SQLi)
在推论SQLi中,Web应用程序不通过直接输出传输数据。相反,攻击者必须通过发送有效载荷并观察以下内容来收集信息:

Web应用程序的响应。
数据库服务器的行为。
网页中的差异。
这是一个盲SQLi的示例:

全局$ wpdb;

$ title = $ wpdb-> get_var(“从”。$ wpdb-> posts。“中选择post_title,其中ID =”。$ _GET ['id']);
通过将$_GET[‘id’]变量连接到查询,用户输入直接进入数据库。浏览器从不显示输出,但是攻击者可以通过分析服务器的反应来收集有关数据库的信息。

与带内SQLi相比,这种注入类型需要更多的时间进行开发,但后果同样危险。

基于内容的盲SQLi
基于内容的SQLi是一种推论性技术,攻击者可根据查询是返回aTRUE还是返回结果来迫使数据库返回不同的结果FALSE 。

这是基于内容的SQLi的示例:

从wp_posts中选择post_status,其中

ID = 1,并且(从wp_users中选择1,其中

substring(user_pass,1,1)='a'并且ID = 1)
此查询检查ID为1的用户的哈希密码的第一个字母是否为A。攻击者看不到输出时,网页行为显示查询是否为真。黑客可以使用此技术遍历每个字符并提取管理员密码。

基于内容的SQLi攻击速度很慢,尤其是在大型数据库上。攻击者必须逐个枚举数据库。这种攻击类型的另一个名称是基于布尔的盲SQL注入。

基于时间的盲SQLi
基于时间的SQLi是另一种推理注入技术。攻击者发送查询,迫使数据库在响应之前等待(休眠)特定的秒数。

例如,黑客可以询问数据库管理员帐户的首字母是否以A开头。如果首字母为A,则黑客指示数据库休眠10秒钟。该代码如下所示:

从wp_posts中选择post_title,其中ID = 1

联合选择IF(

substring(wp_users.user_login,1,1)='a',

基准(10000000,ENCODE('blah','asdf')),

空值)

来自wp_users,其中ID = 1
黑客可能看不到输出,但是生成网页的响应时间揭示了答案。

与基于内容的SQLi一样,基于时间的注入速度很慢。不幸的是,这些攻击通常是完全自动化的,因此不正确的猜测不会减慢该过程。

带外SQLi
带外SQLi是最常见的注入类型,通常在黑客无法发起直接查询响应攻击时发生。取而代之的是,黑客制作了SQL语句,这些语句触发数据库在攻击者的控制下创建与外部服务器的连接。

数据库服务器必须具有发出DNS或HTTP请求的能力,才能将数据传递给攻击者。否则,带外SQLi将不起作用。

当服务器响应不稳定时,攻击者通常选择带外方法来替代基于时间的技术。

如何检测SQL注入?
SQLi尝试通常显示为标准数据库错误,因此如果没有工具,则很难检测到注入。但是,您的安全团队应监视SQL注入的迹象。

每个SQLi都涉及反复试验。黑客通常会设置蠕虫或机器人来反复探测网站是否存在漏洞。设置您的扫描工具,以监视登录失败和语法错误。

以下是检测SQL注入的其他方法:

检查error_reported事件是否存在奇数错误。
在数据库中搜索常见的HTML标记,例如http-equiv="refresh"或iframe。
监视流量以了解行为的可疑更改,尤其是权限和密码的更改。
设置基于网络的入侵检测系统(IDS),以监视与数据库服务器的连接。
设置基于主机的IDS来监视Web服务器日志。

输入清理(或验证)是检查和过滤用户输入的一种做法。此技术确保应用程序可以识别非法的用户输入和危险的可执行文件。

开发人员可以通过以下三种方式清除输入:

清除白名单:只有预先批准的字符和代码字符串才能到达数据库。
黑名单清理:开发人员禁止某些字符进入数据库(换行符,多余的空格,标签,制表符等)。
转义清理:查询中的所有数据在执行查询之前都需要先进行SQL转义。
通常,白名单比黑名单更简单,更安全。聪明的黑客可以找到解决黑名单的方法,因此请尽可能在白名单上验证用户输入。

另一个好的做法是使用下拉菜单和单选按钮来验证用户输入。这些输入字段可防止用户键入输入并停止注入可执行代码。

参数化的SQL代码
参数化查询要求开发人员先定义所有SQL代码,然后再将每个参数传递给查询。这种编码风格使数据库能够区分代码和数据,这是动态SQL查询无法实现的功能。

参数化的SQL代码可防止攻击者即使插入命令也无法更改查询的意图。例如,如果黑客输入了用户ID'1 '='1,则查询将查找与整个'1'='1字符串匹配的用户名。数据库将不接受该查询作为命令。

限制用户权限
采用零信任安全性,并将用户限制为执行角色所需的最低限度权限。具有读写执行权限的帐户越少越好。

例如,如果一个网站只返回数据库内容与SELECT声明,不授予连接其他特权,比如INSERT,UPDATE或者DELETE。

另一个好的做法是不信任所有用户输入。将内部用户的输入与来自外部和第三方的输入一样对待。另外,切勿允许Web应用程序以管理员权限连接到数据库。

设置防火墙
使用Web应用程序防火墙(WAF)筛选Web应用程序和数据库之间的所有流量。防火墙可以保护所有面向Web的应用程序,因此请设置防御措施以阻止SQLi和类似的网络攻击。

 

连接MySQL错误:Can't connect to MySQL server (10060)

使用图形界面管理工具Navicat for MySQL连接Mysql数据库时提示错误:Can't connect to MySQL server (10060)

 

问题原因:

导致些问题可能有以下几个原因:

1、网络不通;

2、服务未启动;

3、防火墙端口未开放;

解决方法:

启动服务:

service mysqld start;


经过分析,我遇到的这个问题是防火墙导致的!

开放防火墙端口
添加需要监听的端口
/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

保存设置
/etc/init.d/iptables save

查看状态
/etc/init.d/iptables status

临时关闭防火墙服务
service iptables stop

开启防火墙服务
service iptables start

开机不再启动防火墙服务
chkconfig iptables off

注意:
此文档适用服务器环境为:CentOS 6.5  MySQL 5.6

MySQL远程连接ERROR 2003 (HY000):Can't connect to MySQL server on'XXXXX'(111) 的问题

装了个navicat ,然后去连接mysql服务器,一直连不上,一开始以为是防火墙问题,后来防火墙都关闭,
 iptable服务关闭,还是不行,网上查了下:主要是因为设置了bind_address=127.0.0.1

原文引用:

问题描述:

从一台linux远程连接另一台linux上的MySQL, 出现ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.85'(111)错误。
[mysql@vvmvcs0 ~]$ mysql -hxxx.xxx.xxx.85 -uroot -p
Enter password: www.2cto.com
ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.85' (111)
[mysql@vvmvcs0 ~]$ perror 111
OS error code 111: Connection refused
查看errorCode
[mysql@vvmvcs0 ~]$ perror 111
OS error code 111: Connection refused
问题分析:
1,可能网络连接问,远程ping xxx.xxx.xxx.85 ,能ping通,排除此情况
[mysql@vvmvcs0 ~]$ ping xxx.xxx.xxx.85
PING xxx.xxx.xxx.85 (xxx.xxx.xxx.85) 56(84) bytes of data.
64 bytes from xxx.xxx.xxx.85: icmp_seq=1 ttl=63 time=0.230 ms
2,排查可能由于85上my.cnf里配置了skip_networking或者bind_address,只允许本地socket连接
2.1 在[mysqld]下设置skip_networking,
知识说明: 这使用MySQL只能通过本机Socket连接(socket连接也是本地连接的默认方式),放弃对TCP/IP的监听 www.2cto.com
当然也不让本地java程序连接MySQL(Connector/J只能通过TCP/IP来连接)。
2.2 可能使用了bind_address=127.0.0.1(当然也可以是其他ip)
[mysqld]
bind_address=127.0.0.1
知识说明:这种情况可以TCP/IP连接
通过查看了my.cnf文件,以上两个都是没设置的,排除掉这两种情况
3,排查DNS解析问题,检查是否设置了: skip_name_resolve。 这个情况肯定不可能,因为我用的是ip,不是主机名。
[mysqld]
skip_name_resolve
知识说明:这个参数加上后,不支持主机名的连接方式。
4, 排查用户和密码问题, 其实用户和密码的错误,不会出现111的,所以排除用户密码问题
ERROR 1045 (28000): Access denied for user 'root'@'XXXX' (using password: YES)
5,排查--port问题,有可能85的MySQL port不是默认3306, 这样我远程连接时,没有指定--port,用的是3306, 而85上没有对3306进行监听。
ps -ef | grep mysqld
果然是: 85上的MySQL使用的是3308 port.
最终连接方式:加上--port=3308
[mysql@vvmvcs0 ~]$ mysql -hxxx.xxx.xxx.85 -uroot -p --port=3308
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
为什么出现这么低级的错误呢?
因为我一直在用85上的MySQL, 而且每次都是直接用mysql -uroot就连接上了,没有指定--port,这样我就一直以为这MySQL的port一直是默认的3306的。
其实根本原因是:
1. MySQL本地连接,如果不指mysql --protocol=tcp, 连接默认是socket方式连接的。这点大家都知道。 www.2cto.com
2, MySQL socket连接是根据sokect文件来的,与--port不相关的,如果是一机多实例,则用-S(或者--socket=name )来指定连接哪个实例。
就是这个socket连接对--port无识别效果,导致排查这个问题这么久。
见下面: 其实85上只有一个port为3308的MySQL实例,但是用3306仍然是连接上此实例,说明socket连接方式忽略--port参数。
-bash-3.2$ mysql -uroot --port=3308
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql -uroot --port=3306
Welcome to the MySQL monitor. Commands end with ; or \g.
再次说明基础细节很重要啊。

mysql导入数据出现Errcode: 2 - No such file or directory错误信息

在导入数据出现这个错误一般是因为地址里面的斜杠使用错误。比如下面

load data local infile 'D:\road.txt'into table roadcd fields terminated by '\t';
      我参考许多资料,这里的地址都是使用单斜杠,但我却出现下面的错误信息:
oad.txt' not found (Errcode: 2 - No such file or directory)


    如果你和我们错误信息一样的话,那就把单斜杠(\)改为双斜杠(\\)试试;

 load data local infile 'D:\\road.txt'into table roadcd fields terminated by '\t';

     这样的话就OK了,数据成功导入

关于流量升高导致TIME_WAIT增加,MySQL连接大量失败的问题

有个应用就是每次都会去查一个接口,接口返回用户的信息数据,从而展现不同的页面效果。大致流程如下

应用APP(电信)->  memcache ->电信custom接口 ->master-db

应用APP(网通)-> 网通custom接口 -> slave-db

接口环境是php(cgi) + nginx,接口已经运行很久,未出过异常

应用访问custom接口,然后接口去查数据库(数据库是主从复制,数据同步,各自机房读各自的数据库,写的话都写master-db)

有一点,就是电信机房是有memcache层的,而网通机房一直没有(考虑到网通机房流量不高,并且机房cache不同步,从上线起就网通机房一直未使用cache)

有一次上线,这个上线的版本有个改动就是把电信机房的memcache也取消了,然后 电信机房流量暴增
FastCGI sent in stderr: "PHPWarning:  mysql_connect()Can't connect to MySQL server on '1.1.1.1' (99)in XXXXXX on line xxx

后来跟dba不断沟通排查,发现电信机房和网通机房的/etc/sysctl.conf配置有所区别

网通机房多了下面几行

net.ipv4.tcp_syncookies =1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle =1

net.ipv4.tcp_fin_timeout= 5

原因就在这,把配置同步到杭电信机房后,问题就解决了,总结如下:

问题描述
上线异常导致qps:五倍+,负载:四十倍+,虽然nginx+php表示很淡定没挂,但error.log飙到了3G/天,全是Can’t connect to MySQL server on ‘*.*.*.*’ (99)
解决异常后,error.log日志少了,但TIME_WAIT依旧减不下去,数据库依旧连接是失败
问题排查
Mysql Config ? (no problem)
max_connect_errors = 50000 (no problem)
max_connections = 1000 (no problem)
max_user_connections = 950 (no problem)
OS Config ? (problem, 按以下修改问题就解决了)
vi /etc/sysctl.conf
// 编辑
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 5
// 让参数生效
/sbin/sysctl -p
问题原因
报错”Can’t connect to MySQL server on ‘*.*.*.*’ (99) ” 参考MySQL Client端错误代码说明:错误代码为99,99的含义:$perror 99 OS error code  99:  Cannot assign requested address 这是一个本地OS的抛错,表示无法分配本地地址资源(应该是端口),socket无法创建
Google一下” Cannot assign requested address”,多半是由于客户端请求过于频繁,而Server端练级关闭后本地暂时处于TIME_WAIT,所以暂时端口都不可用导致。因此修改下OS参数就ok了
问题反思
这个问题非常紧急么?紧急!
参考文章《nginx+php产生大量TIME_WAIT》:http://leven.blog.51cto.com/1675811/382097,遇到这样的问题,我们应该第一时间想到端口不可用,首先会导致nginx连不上php-cgi导致服务不可用,其次才是php-cgi连不上mysql,因此非常重要!
为什么mysql不使用长连接pconnection呢?
pconnection mysql占用大量资源,并且在大并发情况下,例如个性化,活动促销等,连接过多导致无数的连接失败error,并牵制apache(nginx)ThreadsPerChild的参数
高并发下的最佳实践?
apache短连接,nginx短连接,mysql短连接,虽然TIME_WAIT多了,但可通过修改OS内核加速TIME_WAIT的复用,经验之谈啊!

看pv统计:
[xxx@XXXXXX ~]$xxx.sh "find /path -name 'access*'|xargs wc -l|awk 'END{print$1}'" fe 
cmd :find /path 'access*'|xargs wc -l|awk 'END{print }'
type:fe
server1

  2倍A total(28号是Atotal)

server2

  2倍B(28号是B total)

-----------

server3

  C 总计

-----------

server4

  D total

....

other servers ....

网通机房流量一直比较稳定左右,从未出任何问题

就是昨天电信custom接口流量暴增后,出现了异常,电信机房机器负载涨了40多倍,QPS涨了15倍,直到凌晨0:24分才降到1以下

应用也报了短暂的超时警报,不过php和nginx运行还是比较蛋定,重启依然非常快,终端也没有出现很卡的情况

流量是前一天的9倍!

异常就是error.log在上线后飙到3个G!!!

而且错误全都是Can't connect to MySQL server on '1.1.1.1' (99)
即便在命令行下用mysql -hx.x.x.x -u -p

也间歇性地连接不上,但是据dba描述,数据库监控无任何异常,数据库上其他部门的应用也无异常

不知是否机器负载过高导致大量time wait,导致mysql连接超时或连接不上

以下是晚上0点13分的监控:
TIME_WAIT 涨了300倍(不知是否和他有关)

ESTABLISHED 涨了10倍

按理说,custom的网通接口流量非常稳定,从未出现过异常,电信机房接口飙了2倍就抗不住了,load直线上升,

为了排除cache引起的流量导致接口异常,22:30左右重新上了2个文件,把电信机房的memcache重新开启,

开启后慢慢load是降了,但是mysql错误依旧只是没那么多了

现在去机器上看,还是大量错误,提取日志如下

Redhat7 CentOS7 无法启动mysql 的解决办法

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。[3]

MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,10.0.9版起使用XtraDB(名称代号为Aria)来代替MySQL的InnoDB

试着去启动mysql服务,仍然不行

下面讲正确的步骤

 

搞定!

如何设置mysql root密码

# mysql_secure_installation
mysql_connect报告”No such file or directory”错误的解决方法

写了个php脚本单独执行mysql_connect(),发现错误信息居然是“No such file or directory"!

首先确定是mysql_connect()和mysql_pconnect()的问题,故障现象就是函数返回空,而mysql_error()返回"No such file or directory"。
写个phpinfo页面,找到mysql.default_socket、mysqli.default_socket、pdo_mysql.default_socket。
启动mysql,执行命令 STATUS; 记下socket(/tmp/mysql.sock)的值。
则打开php.ini(可以从phpinfo页面中找到php.ini的位置),将2中提到的三个配置项的值改成3的值。
重启apache。

到/tmp/查看,发现没有真没有/tmp/mysql.sock这个文件。

由于mysql 默认的mysql.sock 是在/var/lib/mysql/mysql.sock,创建符号连接:
# ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

Mysql错误:Ignoring query to other database解决方法

Mysql错误:Ignoring query to other database解决方法
今天登陆mysql show databases出现Ignoring query to other database错误,又试了几个命令和sql全部提示Ignoring query to other database错误
错误如下:
D:\Program Files\MySQL\MySQL Server 5.6\bin>mysql -root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 66
Server version: 5.6.15 MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
Ignoring query to other database
mysql> show tables;
Ignoring query to other database
折腾了半天才发现原来是在连接mysql时没有"-u"参数导致的
D:\Program Files\MySQL\MySQL Server 5.6\bin>mysql -uroot

重新连接mysql 加上-u参数 一切正常

MySQL出现Ignoring query to other database的问题

今天使用mysql的时候,输入任意一条命令都会出:
Ignoring query to other database
这条错误信息,很是奇怪。后来才发现是登录数据库时,少了个-u的参数。。
正确的命令是:
mysql -uroot -p
我输入的是:
mysql -root -p
加上-u就可以了

MySql错误:mysqld: Can't create directory '/usr/local/mysql/data/--user=mysql/' (Errcode: 2 - No such f

今天配置mysql数据库的时候配置文件都写好了,权限也给了,初始化的时候,发现没有/usr/local/mysql/data文件夹,然后报以下错误:

配置文件啊改参数啊之类的觉得好麻烦,然后我就想他说不能创建那我自己手动创建行不行呢,然后创建了个/usr/local/mysql/data文件夹,重新初始化,初始化成功!

 

客户热线:037125966675