如何解决数据库字符串缓冲区太小问题? (数据库字符串缓冲区太小)

在数据库开发中,字符串缓冲区大小是一个常见问题,它可能导致数据被截断,或者查询操作失败。本文将介绍一些解决方法,帮助开发者避免该问题。

1. 检查数据库配置

我们要检查数据库配置中是否存在字符串缓冲区大小的配置项。不同数据库可能存在不同的配置项,例如 MySQL 中的 max_allowed_packet,Oracle 中的 sqlnet.inbound_connect_timeout。如果该配置项存在,则可以适当地增加缓冲区大小。

2. 增加缓冲区大小

如果数据库配置中不存在字符串缓冲区大小的配置项,我们可以尝试手动增加缓冲区大小。在 MySQL 中,可以使用 SET GLOBAL max_allowed_packet=; 命令来增加缓冲区大小,其中 为缓冲区大小的数值(单位为字节)。

在 Oracle 中,可以使用 ALTER SYSTEM SET sqlnet.inbound_connect_timeout=yyy; 命令来增加缓冲区大小,其中 yyy 为缓冲区大小的数值(单位为字节)。

值得注意的是,增加缓冲区大小可能会导致性能下降,因此应该谨慎使用。

3. 使用流式查询

如果查询结果中的某个字段超出缓冲区大小,我们可以使用流式查询来避免该问题。流式查询会将查询结果分批次返回,而不是一次性返回所有结果。

在 MySQL 中,我们可以在查询语句中加上”SELECT SQL_CALC_FOUND_ROWS … LIMIT …”语句,这样查询结果会被分成多个批次返回。

在 Oracle 中,我们可以使用游标(CURSOR)来实现流式查询。在查询语句中,可以使用 FOR UPDATE OF 语句创建游标,然后使用 FETCH NEXT 和 CLOSE 语句来获取数据。

4. 使用二进制大对象(BLOB)

如果需要存储较大的字符串,我们可以考虑使用二进制大对象(BLOB)来代替字符串类型。BLOB 类型可以存储任意二进制数据,包括图片、音频等非文本数据。

在 MySQL 中,可以使用 LONGBLOB 数据类型来存储 BLOB 类型数据;在 Oracle 中,可以使用 BLOB 或 CLOB 数据类型来存储 BLOB 类型数据。

5. 使用文本大对象(CLOB)

如果需要存储较大的文本数据,我们可以考虑使用文本大对象(CLOB)来代替字符串类型。CLOB 类型可以存储任意文本数据,包括长文本、XML 等。

在 MySQL 中,可以使用 LONGTEXT 数据类型来存储 CLOB 类型数据;在 Oracle 中,可以使用 BLOB 或 CLOB 数据类型来存储 CLOB 类型数据。

在日常开发中,数据库字符串缓冲区太小问题是一个比较常见的问题。本文介绍了一些解决方法,包括检查数据库配置、增加缓冲区大小、使用流式查询、使用二进制大对象和文本大对象等。开发者可以根据具体情况选择合适的解决方法。同时,我们也需要意识到,增加缓冲区大小可能会导致性能下降,因此应该谨慎使用。

相关问题拓展阅读:

错误691?

提示错误691真正意义上来讲可能是以下原因:

1:域名出现错误,(用户名或密码输入错误);

2:或宽带到期欠费造成;

3: 服务器无反映,(机房用户端口错误,或帐号未被激活);

4:硬件故障。

5G+1000M宽带任性用,智能双千兆,定制美好生活,详情可登录广西电信网上营业厅查看。客服107号为你解答。

宽带691错误:

  1、欠费

  出现691错误的时候我基本上会首先考虑这个问题,因为这个原因最常见,也最容易解决。只需要查询一下自己的账号是否欠费,如果欠费充值后就可以连接上,如果不是欠费考虑其他原因。

  2、用户名或者密码错误

  这个不是很常见,如果是拨号上网基本上都会选择保存密码,但是也有可能被其他人动了一下,所以重新输入账号和密码试一下,如果不能解决要考虑其他原因。

  3、MAC地址错误

  这个不常见,经常是电脑上装了两个网卡才会出现,禁用一个就可以了。

  4、账号被盗

  这个其实是用户密码错误的小分类,之所以把他列出来是如果你确信自己的用户名和密码没有错误,有可能别人重设了密码,所以你要打到网络运营商那里重置密码。

  出现错误691的解决方法:

  1、故障时一定要仔细判断,帐号密码的大小写、帐号前后的空格,很难分辨出来。所以当出现691错误时,可以尝试把原来的帐号和密码删掉,重新输入正确帐号及密码。

  2、帐号欠费:ADSL宽带用户欠费后,宽带接入服务商会将该帐号暂时停用,用户交清欠费后,帐号不一定会马上启用,这时如果拨号,也会出现错误691的提示。

  3、宽带服务商限制了你帐户使用数目,如果别人正在使用你的帐号,你拨号就是错误691,请检查同时使用此帐号的人数。

  4、一个帐号更好只在你申请的端口上使用,如果被带到其他的端口上,可能会提示错误691。

  5、由于某种原因,帐号不正常掉线,例如:电脑突然断电。服务器那边还没断开,你的用户还在登录状态,和上面情况类似,所以错误691。这种情况你只需将电脑、Model调制解调器重启,过5—10分钟分重试一般就会好。

  6、电脑禁用网卡后或网卡未正常驱动也会出现691的提示,检查网卡是否正常工作。

  7、用户数据绑定错误:为了更好的服务于用户,保障用户帐号的安全,宽带服务商将宽带帐号和用户的物理端口做了绑定,数量上也做了一对一的绑定,这样,该帐号只能在一个物理端口上使用(即限制了ADSL帐号的漫游),而且一个端口只限一台电脑上网,如果用户的数据绑定错误,拨号时也会出现错误691的提 示。

  8、当电脑上安装了两块本地网卡并且同时启用时。导致MAC地址绑定错误,出现691错误代码,建议禁用其中一块网卡。

了解更多服务优惠请关注“安徽电信”公众号。

如您的联通宽带上网显示“错误691”是由于帐号密码输入错误或欠费,处理方法如下:

1.如有路由器,先断电重启,若仍不能使用,请去掉路由器进行下面操作检测;

2.请先确认宽带是否欠费或到期,如有捆绑手机,请确认手机是否欠费、停机、暂停、拆机,如有以上情况请续费或缴清欠费后再试;

3.请尝试重新输入宽带用户名、密码,或重建宽带连接。

如仍无改善,请拨打人工客服热线,根据语音提示,选择故障自助申告专用通道向联通公司申告,有专人联系您处理。

739

远程服务器无法使用由 Windows NT 加密的密码。

拨号连接或 VPN 连接的错误代码列表

600

某操作处于挂起状态。

601

端口句柄无效。

602

端口已打开。

603

呼叫方缓冲区太小。

604

指定了错误的信息。

605

无法设置端口信息。

606

无法连接端口。

607

事件无效。

608

设备不存在。

609

设备类型不存在。

610

缓冲区无效。

611

路由不可用。

612

没有分配路由。

613

指定了无效的压缩。

614

缓冲区溢出。

615

找不到端口。

616

某异步请求处于挂起状态。

617

端口或设备已断开连接。

618

端口尚未打开。

619

端口已断开连接。

620

没有终结点。

621

无法打开簿文件。

622

无法加载簿文件。

623

找不到簿条目。

624

无法写入簿文件。

625

在簿中发现无效信息。

626

无法加载字符串。

627

找不到密钥。

628

端口已断开连接。

629

端口已由远程机器断开连接。

630

端口由于硬件故障已断开连接。

631

端口已由用户断开连接。

632

结构大小不正确。

633

端口已被使用或不是为远程访问拨出配置的。

634

无法在远程网络上注册您的计算机。

635

未知错误。

636

端口连接了错误的设备。

637

无法转换字符串。

638

请求已超时。

639

没有可用的异步网络。

640

出现 NetBIOS 错误。

641

服务器无法分配需要用来支持客户端的 NetBIOS 资源。

642

您的一个 NetBIOS 名称已在远程网络上注册。

643

服务器上的网卡失败。

644

您将无法接收弹出的网络信息。

645

内部身份验证错误。

646

不允许本帐户在此时间登录。

647

帐户已禁用。

648

密码已过期。

649

帐户没有远程访问权限。

650

远程访问服务器没有响应。

651

您的调制解调器(或其它连接设备)报告了一个错误。

652

无法识别来自该设备的响应。

653

在设备 .INF 文件段中找不到设备所需的宏。

654

在设备 .INF 文件段中的命令或响应引用了未定义的宏

655

在设备 .INF 文件段中找不到 宏。

656

在设备 .INF 文件段的 宏中包含未定义的宏

657

无法打开设备 .INF 文件。

658

设备 .INF 或媒体 .INI 文件中的设备名太长。

659

媒体 .INI 文件引用了未知设备名。

660

设备 .INF 文件中不包含任何命令的响应。

661

设备 .INF 文件中缺少一个命令。

662

试图设置设备 .INF 文件段中未列出的宏。

663

媒体 .INI 文件引用了未知设备类型。

664

无法分配内存。

665

端口不是为远程访问配置的。

666

您的调制解调器(或其它连接设备)不起作用。

667

无法读取媒体 .INI 文件。

668

连接已断开。

669

媒体 .INI 文件中的参数用法无效。

670

无法从媒体 .INI 文件中读取段名。

671

无法从媒体 .INI 文件中读取设备类型。

672

无法从媒体 .INI 文件中读取设备名。

673

无法从媒体 .INI 文件中读取用法。

674

无法从媒体 .INI 文件中读取更大连接 BPS 频率。

675

无法从媒体 .INI 文件中读取更载 BPS 频率。

676

线路忙。

677

是某人而不是调制解调器应答。

678

没有应答。

679

无法检测载波。

680

没有拨号音。

681

设备报告了常见错误。

682

写入 SECTIONNAME 时出错

683

写入 DEVICETYPE 时出错

684

写入 DEVICENAME 时出错

685

写入 MAXCONNECTBPS 时出错

686

写入 MAXCARRIERBPS 时出错

687

写入用法时出错

688

写入 DEFAULTOFF 时出错

689

读取 DEFAULTOFF 时出错

690

清空 INI 文件时出错

691

由于域上的用户名和/或密码无效而拒绝访问。

692

端口或连接的设备硬件故障。

693

错误,不是二进制宏

694

错误,找不到 DCB

695

错误,状态机器没有开始

696

错误,状态机器已经开始

697

错误,响应环不完整

698

设备 .INF 文件中的响应键名不符合所需格式。

699

设备响应导致缓冲区溢出。

700

设备 .INF 文件中的扩展命令太长。

701

设备采用了 COM 驱动程序不支持的 BPS 频率。

702

意外地收到了设备响应。

703

错误的交互模式

704

错误,回拨号码不对

705

错误,无效的身份验证状态

706

写入 INITBPS 时出错

707

X.25 诊断指示。

708

帐户已过期。

709

在域上更改密码时出错。

710

与您的调制解调器通信时检测到序列溢出错误。

711

RasMan 初始化失败。检查事件日志。

712

双向传输端口正在初始化。请等待几秒钟再重拨号。

713

没有活动的 ISDN 线路可用。

714

没有足够的 ISDN 通道可用于实现此调用。

715

线质量太差,发生太多错误。

716

远程访问 IP 配置无法使用。

717

静态远程访问 IP 地址池中无可用的 IP 地址。

718

PPP 超时。

719

PPP 已由远程机器终止。

720

未配置 PPP 控制协议。

721

远程 PPP 对等机不响应。

722

PPP 数据包无效。

723

包括前缀和后缀的号码太长。

724

IPX 协议无法在此端口拨出,因为此计算机是 IPX 路由器。

725

IPX 协议无法在此端口拨入,因为未安装 IPX 路由器。

726

IPX 协议不能同时在一个以上的端口上用于拨出。

727

无法访问 TCPCFG.DLL。

728

找不到与远程访问绑定的 IP 适配器。

729

除非安装 IP 协议,否则无法使用 SLIP。730

计算机注册未完成。

731

没有配置协议。

732

PPP 协商尚未聚合。

733

针对此网络协议的 PPP 控制协议在此服务器上不可用。

734

PPP 链接控制协议已终止。

735

服务器拒绝接受请求地址。

736

远程计算机终止了控制协议。

737

检测到环回。

738

服务器没有指派地址。

739

远程服务器无法使用由 Windows NT 加密的密码。

740

为远程访问配置的 TAPI 设备未能初始化,或未得到正确的安装。

741

本地计算机不支持加密。

742

远程服务器不支持加密。

743

远程服务器要求加密。

744

无法使用由远程服务器指派(原为分配)的 IPX 网络号。检查事件日志。

745

ERROR_INVALID_M

746

ERROR_M_UNINITIALIZED

747

ERROR_NO_MAC_FOR_PORT

748

ERROR_M_TIMEOUT

749

ERROR_BAD_PHONE_NUMBER

750

ERROR_WRONG_MODULE

751

回拨号码包含一个无效字符。号码中只允许有下列 18 个字符:0 到 9、T、P、W、(、)、-、@ 和空格

752

执行脚本时遇到语法错误。

753

无法中断连接,因为它是由多协议路由器创建的。

754

系统无法找到多重链接绑定。

755

因为这个项目已有一个自定义的拨号程序,因此系统不能做自动拨号。

756

已经拨了这个连接。

757

无法自动开始远程访问服务。详细情况请检查事件日志。

758

Internet 连接共享已经在连接上启用。

759

在更改现存的 Internet 连接共享设置时,出现了一个错误。

760

路由能力被启用时,出现了一个错误。

761

为连接启用 Internet 连接共享时,出现了一个错误。

762

为共享配置局域网时,出现了一个错误。

763

无法启用 Internet 连接共享。除了共享的连接外,还有一个以上 LAN 连接。

764

没有安装智能卡读取器。

765

无法启用 Internet 连接共享。一个已经用 IP 地址配置的 LAN 连接需要自动 IP 地址。

766

找不到证书。使用通过 IPSec 的 L2TP 协议的连接要求安装一个机器证书,它也叫作计算机证书。

767

无法启用 Internet 连接共享。所选的作为专用网络的 LAN 连接有不止一个配置的 IP 地址。在启用 Internet 连接共享之前,请用一个单一的 IP 地址重新配置 LAN 连接。

768

因为加密数据失败连接尝试失败。

769

无法连接到指定目标。

770

远程计算机拒绝连接尝试。

771

由于网络忙连接尝试失败。

772

远程计算机的网络硬件与呼叫请求的种类不兼容。

773

由于目的号码更改,连接尝试失败。

774

由于临时失败,连接尝试失败。请重新连接。

775

远程计算机的呼叫被阻。

776

由于远程计算机启用了“不要打扰”功能,调用不能连接。

777

由于远程计算机上的调制解调器(或其它连接设备)出现故障,连接尝试失败。

778

不能验证服务器的身份。

779

如果用这个连接拨出,您必须使用智能卡。

780

尝试的功能在这个连接上无效。

781

连接需要证书,但是没有找到有效的证书。需要更多协助,请单击“详细信息”,或在帮助和支持中心查找此错误号。

782

不能启用 Internet 连接共享(ICS)和 Internet 连接防火墙(ICF),因为已在此计算机上启用了路由和远程访问。要启用 ICS 或 ICF,首先要禁用路由和远程访问。有关路由和远程访问,ICS 或 ICF 的更多信息,请参阅帮助和支持。

783

无法启用 Internet 连接共享。选择的作为专用网络的 LAN 连接不存在,或者没有与网络连接。请在启用 Internet 连接共享之前确认 LAN 网卡已连接。

784

您在登录时不能用此连接拨号,因为它被配置为使用一个与智能卡上的名称不同的用户名。如果您想在登录时使用它,必须将其配置为使用智能卡上的用户名。

785

您在登录时不能用此连接拨号,因为它没有配置为使用智能卡。如果您想在登录时使用它,必须编辑此连接的属性使其使用智能卡。

786

L2TP 连接尝试失败,因为在您的计算机上没有有效的机器证书以进行安全身份验证。

787

L2TP 连接尝试失败,因为安全层不能身份验证远程计算机。

788

L2TP 连接尝试失败,因为安全层不能与远程计算机协商兼容的参数。

789

L2TP 连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到一个处理错误。

790

L2TP 连接尝试失败,因为在远程计算机上的证书确认失败。

791

L2TP 连接尝试失败,因为没有找到此连接的安全策略。

792

L2TP 连接尝试失败,因为安全协商超时。

793

L2TP 连接尝试失败,因为在协商安全时发生一个错误。

794

此用户的帧协议 RADIUS 属性不是 PPP。

795

此用户的隧道类型 RADIUS 属性不正确。

796

此用户的服务类型 RADIUS 属性既不是帧也不是回拨帧。

797

不能建立到远程计算机的连接,因为没有找到调制解调器,或者调制解调器忙。需要更多协助,请单击“详细信息”,或在帮助和支持中心查找此错误号。

798

没有找到一个可以用于可扩展的身份验证协议的证书。

799

由于网络上发生 IP 地址冲突,因此不能启用 Internet 连接共享访问 (ICS)。ICS 要求主机被配置为用 192.168.0.1。请确认网络上没有其它客户端被配置为用 192.168.0.1。

800

不能建立 VPN 连接。VPN 服务器可能不能到达,或者此连接的安全参数没有正确配置。

801

此连接被配置成验证访问服务器的身份,但是 Windows 不能证实服务器发送的数字证书。

802

无法识别所提供的卡。请检查卡是否正确插入,是否插接紧密。

803

保存在会话 cookie 中的 PEAP 配置和当前的会话配置不匹配。

804

保存在会话 cookie 中的 PEAP 标识和当前标识不匹配。

805

您不能在登录时使用此连接拨号,因为它被配置成使用登录后的用户身份证。

900

路由器未运行。

901

接口已连接。

902

路由器不认得指定的协议标识符。

903

请求拨号接口管理器未运行。

904

此名称的接口已经与路由器一起注册了。

905

此名称的接口未与路由器一起注册。

906

接口未连接。

907

指定的协议正停止。

908

接口已连接所以不能删除。

909

接口凭据未设置。

910

此接口已经在连接过程中。

911

已经在进行这个接口上的路由选择信息更新。

912

接口配置无效。已有另一接口与远程路由器上的同一接口相连。

913

一个远程访问客户端试着通过只保留给路由器的端口进行连接。

914

一个请求拨号路由器试着通过只保留给远程访问客户端的端口进行连接。

915

具有此名称的客户端接口已经存在,而且已连接。

916

接口处于停用状态。

917

身份验证协议被远程对等机拒绝。

918

没有可用的身份验证协议。

919

远程计算机拒绝使用配置好的身份验证协议被进行身份验证。线路已断开。

920

远程帐户没有远程访问权限。

921

远程帐户已过期。

922

远程帐户已停用。

923

在一天中的这个时段中不允许远程帐户登录。

924

对远程对等机器的访问被拒绝,因为在域上的用户名和/或密码不正确。

925

没有路由选择许可的端口可让这个请求拨号接口使用。

926

端口已经中断连接,因为它处于非活动状态。

927

此时无法到达接口。

928

请求拨号服务处于暂停状态。

929

接口已经被系统管理员切断。

930

身份验证服务器未及时响应身份验证请求。

931

已经达到多重链接的连接可使用的最多端口数。

932

已经达到用户的连接时间限制。

933

已经达到支持的 LAN 接口的更大数目。

934

已经达到支持的请求拨号接口的更大数目。

935

已经达到支持的远程访问客户端的更大数目。

936

由于 BAP 策略,端口已经被断开。

937

因为此类型的另一个连接正在使用,传入的连接不能接受您的连接请求。

938

网络上没有找到 RADIUS 服务器。

939

从 RADIUS 身份验证服务器收到一无效的响应。请确保 RADIUS 服务器的区分大小写的机密密码设置正确。

940

此时您没有连接的权限。

941

您没有使用当前设备类型连接的权限。

942

您没有使用所选身份验证协议连接的权限。

943

此用户需要 BAP。

944

此时不允许接口连接。

945

保存的路由器配置与当前路由器不兼容。

946

RemoteAccess 检测到旧版的格式用户帐户不会被自动迁移。要手动迁移这些,运行 XXXX。

948

传输已经用路由器安装。

949

从 RADIUS 服务器的数据库里收到无效的签字长度。

950

从 RADIUS 服务器的数据包里收到无效的签字。

951

没从 RADIUS 服务器跟 EAPMessage 一起收到签字。

952

从 RADIUS 服务器收到带有无效长度或 ID 的数据包。

953

从 RADIUS 服务器收到带有无效长度的属性的数据包。

954

从 RADIUS 服务器收到无效的数据包。

955

身份验证器在来自 RADIUS 服务器的数据包里不相符。

总的说 可能是 突然断电或关机 然后在联网 就可能出现这种情况 等等就好 详细往下看

宽带adsl拨号上网用户常常遇到的故障提示。宽带adsl拨号上网使用pppoe协议连接,通过线传输数据,使用adsl专用modem实现数据的调制解调,提示错误691真正意义上来讲: 1:域上名出现错误,(用户名或密码输入错误)。 2:或宽带到期欠费造成。3: 服务器无反映,(机房用户端口错误,或帐号未被激活)。 4:硬件故障

错误代码691的故障主要有以下原因:

1、用户数据绑定错误:为了更好的服务于用户,,保障用户帐号的安全,电信将宽带帐号和用户的物理端口做了绑定,数量上也做了一对一的邦定,这样,该帐号只能在一个物理端口上使用(即限制了ADSL帐号的漫游),而且一个端口只限一台电脑上网,如果用户的数据绑定错误,拨号时也会出现错误691的提示。

2、帐号被他人盗用:在宽带帐号没有绑定之前,ADSL用户的帐号经常会被他人盗用。一旦ADSL宽带帐号被他人使用,再次拨号时,系统也会出现错误691的提示。

3、故障时一定要仔细判断,尤其是帐号前与后的空格,很难分辨出来。所以当出现691错误时,首先把原来的帐号和密码删掉,重新输入正确帐号及密码。

4、帐号欠费:ADSL宽带用户欠费后,宽带接入服务商会将该帐号暂时停用,用户交清欠费后,帐号不一定会马上启用,这时如果拨号,也会出现错误691的提示。

5、电脑硬件原因:当电脑上安装了两块网卡并且都启用时。导致MAC地址邦定错误,出现691错误代码,建议禁用其中一快网卡。

6、电脑禁用网卡后或网卡未驱动或驱动错误拔号也会出现691的提示,检查网卡是否正常工作。

7、猫(model调制解调器)的设置问题,和运营商联系,一般这种问题运营商免费包换。

8、有时在电脑突然断电时,也会有此错误,在开机后,只需等待10分钟后,就可能会自动解决。

9、使用VPN由于域上的用户名/密码无效而拒绝访问。

以上是个人在维修电脑时的不完整的总结与经验,如未能帮你解决此问题,你可以联系当地的电信宽带的运营商,

宽带线路业务电信有专业的维修人员来帮你解决。

错误原因:验证失败,可能是用户名口令输入错误,请检查用户名和口令的拼写及大小写及0与o,1与I等;检查服务选项是否选择正确,一般拨号使用互联网、充值请选择自服务;也可能是由于上次联接非正常断线导致后台系统没有收到用户下线信息而没有在用户在线表中将用户删除;也可能PPPOE广播包被本广播域内的其它PPPOE SERVER截获,反馈一错误消息。

缓冲区溢出攻击的基本原理是什么?

缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击行动。缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统关机、重新启动等后果。

缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就是为缓冲区溢出埋下隐患。操作系统所使用的缓冲区,又被称为堆栈,在各个操作进程之间,指令会被临时储存在堆栈当中,堆栈也会出现缓冲区溢出。

缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统当机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。缓冲区溢出攻击有多种英文名称:bufferoverflow,bufferoverrun,ashthestack,trashthestack,scribblethestack,manglethestack,memoryleak,overrunscrew;它们指的都是同一种攻击手段。之一个缓冲区溢出攻击–Morris蠕虫,发生在十年前,它曾造成了全世界6000多台网络服务器瘫痪。

1.概念

缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间想匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区又被称为”堆栈”.在各个操作进程之间,指令会被临时储存在”堆栈”当中,”堆栈”也会出现缓冲区溢出。

2.危害

在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。

3.缓冲区攻击

一.缓冲区溢出的原理

通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:

voidfunction(char*str){

charbuffer;

strcpy(buffer,str);

}

上面的strcpy()将直接吧str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf()等。

当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentationfault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。

缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。

在1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。而在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,至少有半数的建议是和缓冲区溢出有关的。在Bugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。

缓冲区溢出漏洞和攻击有很多种形式,会在第二节对他们进行描述和分类。相应地防卫手段也随者攻击方法的不同而不同,将在第四节描述,它的内容包括针对每种攻击类型的有效的防卫手段。

二、缓冲区溢出的漏洞和攻击

缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标:

1.在程序的地址空间里安排适当的代码。

2.通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。

根据这两个目标来对缓冲区溢出攻击进行分类。在二.1节,将描述攻击代码是如何放入被攻击程序的地址空间的。在二.2节,将介绍攻击者如何使一个程序的缓冲区溢出,并且执行转移到攻击代码(这个就是“溢出”的由来)。在二.3节,将综合前两节所讨论的代码安排和控制程序执行流程的技术。

二.1在程序的地址空间里安排适当的代码的方法

有两种在被攻击程序地址空间里安排攻击代码的方法:

1、植入法:

攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含的资料是可以在这个被攻击的硬件平台上运行的指令序列。在这里,攻击者用被攻击程序的缓冲区来存放攻击代码。缓冲区可以设在任何地方:堆栈(stack,自动变量)、堆(heap,动态分配的内存区)和静态资料区。

2、利用已经存在的代码:

有时,攻击者想要的代码已经在被攻击的程序中了,攻击者所要做的只是对代码传递一些参数。比如,攻击代码要求执行“exec(“/bin/sh”)”,而在libc库中的代码执行“exec(arg)”,其中arg使一个指向一个字符串的指针参数,那么攻击者只要把传入的参数指针改向指向”/bin/sh”。

二.2控制程序转移到攻击代码的方法

所有的这些方法都是在寻求改变程序的执行流程,使之跳转到攻击代码。最基本的就是溢出一个没有边界检查或者其它弱点的缓冲区,这样就扰乱了程序的正常的执行顺序。通过溢出一个缓冲区,攻击者可以用暴力的方法改写相邻的程序空间而直接跳过了系统的检查。

分类的基准是攻击者所寻求的缓冲区溢出的程序空间类型。原则上是可以任意的空间。实际上,许多的缓冲区溢出是用暴力的方法来寻求改变程序指针的。这类程序的不同之处就是程序空间的突破和内存空间的定位不同。主要有以下三种:1、活动纪录(ActivationRecords):

每当一个函数调用发生时,调用者会在堆栈中留下一个活动纪录,它包含了函数结束时返回的地址。攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为堆栈溢出攻击(StackSmashingAttack),是目前最常用的缓冲区溢出攻击方式。

2、函数指针(FunctionPointers):

函数指针可以用来定位任何地址空间。例如:“void(*foo)()”声明了一个返回值为void的函数指针变量foo。所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了。它的一个攻击范例就是在Linux系统下的superprobe程序。

3、长跳转缓冲区(Longjmpbuffers):

在C语言中包含了一个简单的检验/恢复系统,称为setjmp/longjmp。意思是在检验点设定“setjmp(buffer)”,用“longjmp(buffer)”来恢复检验点。然而,如果攻击者能够进入缓冲区的空间,那么“longjmp(buffer)”实际上是跳转到攻击者的代码。象函数指针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。一个典型的例子就是Perl5.003的缓冲区溢出漏洞;攻击者首先进入用来恢复缓冲区溢出的的longjmp缓冲区,然后诱导进入恢复模式,这样就使Perl的解释器跳转到攻击代码上了。

二.3代码植入和流程控制技术的综合分析

最简单和常见的缓冲区溢出攻击类型就是在一个字符串里综合了代码植入和活动纪录技术。攻击者定位一个可供溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区溢出,改变活动纪录的同时植入了代码。这个是由Levy指出的攻击的模板。因为C在习惯上只为用户和参数开辟很小的缓冲区,因此这种漏洞攻击的实例十分常见。

代码植入和缓冲区溢出不一定要在在一次动作内完成。攻击者可以在一个缓冲区内放置代码,这是不能溢出的缓冲区。然后,攻击者通过溢出另外一个缓冲区来转移程序的指针。这种方法一般用来解决可供溢出的缓冲区不够大(不能放下全部的代码)的情况。

如果攻击者试图使用已经常驻的代码而不是从外部植入代码,他们通常必须把代码作为参数调用。举例来说,在libc(几乎所有的C程序都要它来连接)中的部分代码段会执行“exec(something)”,其中somthing就是参数。攻击者然后使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出使程序指针指向libc中的特定的代码段。

三、缓冲区溢出攻击的实验分析

2023年1月,Cerberus安全小组发布了微软的IIS4/5存在的一个缓冲区溢出漏洞。攻击该漏洞,可以使Web服务器崩溃,甚至获取超级权限执行任意的代码。目前,微软的IIS4/5是一种主流的Web服务器程序;因而,该缓冲区溢出漏洞对于网站的安全构成了极大的威胁;它的描述如下:

浏览器向IIS提出一个HTTP请求,在域名(或IP地址)后,加上一个文件名,该文件名以“.htr”做后缀。于是IIS认为客户端正在请求一个“.htr”文件,“.htr”扩展文件被映像成ISAPI(InternetServiceAPI)应用程序,IIS会复位向所有针对“.htr”资源的请求到I.DLL程序,I.DLL打开这个文件并执行之。

浏览器提交的请求中包含的文件名存储在局部变量缓冲区中,若它很长,超过600个字符时,会导致局部变量缓冲区溢出,覆盖返回地址空间,使IIS崩溃。更进一步,在如图1所示的2K缓冲区中植入一段精心设计的代码,可以使之以系统超级权限运行。

四、缓冲区溢出攻击的防范方法

缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权。如果能有效地消除缓冲区溢出的漏洞,则很大一部分的安全威胁可以得到缓解。

目前有四种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响。在四.1中介绍了通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码。在四.2中介绍了强制写正确的代码的方法。在四.3中介绍了利用编译器的边界检查来实现缓冲区的保护。这个方法使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁,但是相对而言代价比较大。在四.4中介绍一种间接的方法,这个方法在程序指针失效前进行完整性检查。虽然这种方法不能使得所有的缓冲区溢出失效,但它能阻止绝大多数的缓冲区溢出攻击。然后在四.5,分析这种保护方法的兼容性和性能优势。

四.1非执行的缓冲区

通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被植入被攻击程序输入缓冲区的代码,这种技术被称为非执行的缓冲区技术。在早期的Unix系统设计中,只允许程序代码在代码段中执行。但是近来的Unix和MSWindows系统由于要实现更好的性能和功能,往往在数据段中动态地放入可执行的代码,这也是缓冲区溢出的根源。为了保持程序的兼容性,不可能使得所有程序的数据段不可执行。

但是可以设定堆栈数据段不可执行,这样就可以保证程序的兼容性。Linux和Solaris都发布了有关这方面的内核补丁。因为几乎没有任何合法的程序会在堆栈中存放代码,这种做法几乎不产生任何兼容性问题,除了在Linux中的两个特例,这时可执行的代码必须被放入堆栈中:

(1)信号传递:

Linux通过向进程堆栈释放代码然后引发中断来执行在堆栈中的代码来实现向进程发送Unix信号。非执行缓冲区的补丁在发送信号的时候是允许缓冲区可执行的。

(2)GCC的在线重用:

研究发现gcc在堆栈区里放置了可执行的代码作为在线重用之用。然而,关闭这个功能并不产生任何问题,只有部分功能似乎不能使用。

非执行堆栈的保护可以有效地对付把代码植入自动变量的缓冲区溢出攻击,而对于其它形式的攻击则没有效果。通过引用一个驻留的程序的指针,就可以跳过这种保护措施。其它的攻击可以采用把代码植入堆或者静态数据段中来跳过保护。

四.2编写正确的代码

编写正确的代码是一件非常有意义的工作,特别象编写C语言那种风格自由而容易出错的程序,这种风格是由于追求性能而忽视正确性的传统引起的。尽管花了很长的时间使得人们知道了如何编写安全的程序,具有安全漏洞的程序依旧出现。因此人们开发了一些工具和技术来帮助经验不足的程序员编写安全正确的程序。

最简单的方法就是用grep来搜索源代码中容易产生漏洞的库的调用,比如对strcpy和sprintf的调用,这两个函数都没有检查输入参数的长度。事实上,各个版本C的标准库均有这样的问题存在。

此外,人们还开发了一些高级的查错工具,如faultinjection等。这些工具的目的在于通过人为随机地产生一些缓冲区溢出来寻找代码的安全漏洞。还有一些静态分析工具用于侦测缓冲区溢出的存在。

数据库字符串缓冲区太小的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于数据库字符串缓冲区太小,如何解决数据库字符串缓冲区太小问题?,错误691?,缓冲区溢出攻击的基本原理是什么?的信息别忘了在本站进行查找喔。


数据运维技术 » 如何解决数据库字符串缓冲区太小问题? (数据库字符串缓冲区太小)