当前位置:七道奇文章资讯数据防范MySQL防范
日期:2011-05-02 15:51:00  来源:本站整理

Linux利用集成MySQL数据库拜候本领[MySQL防范]

赞助商链接



  本文“Linux利用集成MySQL数据库拜候本领[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
本文描写了MySQL,一种操纵第三方数据库开辟电子贸易和别的复杂、动态网站的有效工具.MySQL 是一种快速、多线程和全功效的 SQL服务器.除了描写MySQL系统的基本体系构造以外,本文还供应了以Tcl和C++编写的简单示例,帮忙您开辟支持数据库的Web利用.

一个必须存储或拜候大量信息的利用程序可以从利用第三方数据库产品中受益匪浅.在对信息的拜候必须在程序的多个实例上举行时更是如此.基于Web的利用(包含电子贸易)就是它的杰出例证.

为什么利用独立数据库?

Web服务器必须使其处理脚本有办法来存储有关供其今后拜候的状况信息.固然有大概利用对比原始一些的办法--比方转储到文本文件或开辟克己的迷你数据库 --但只有成熟的数据库利用才能供应更为复杂的Web利用所需的全部服务.因为有一些免费得到的软件包可用于该目的,所以编写定制的特定于利用的数据库引擎并没有太大好处. 别的,利用第三方数据库还使Web开辟者没必要投入到开辟和保护数据库的任务中.

MySQL数据库

通过利用脚本语言和编译型系统语言(比方 C),将数据库集成到Linux利用便大概相当简单.可免费得到的MySQL(在GNU Public License下发行)数据库供应了一系列复杂的SQL功效,并易于集成到利用中.MySQL是快速、多线程的,并支持ANSI和ODBC SQL尺度.加上第三方软件,MySQL就支持用于事件处理利用的事件安全的表.

注:什么是事件处理?

事件是需求以原子方法履行的对数据库所做的一系列更改.它们要末必须全部履行,要末一个都不履行. 比方,在Web上贩卖产品时全部必须的数据库更改构成一个事件.

数据库需求同时减去客户帐户余额和产品库存,不然失利并且一个操作都不履行.

无论服务器出于何种缘由发生崩溃都不该该惹起事件被部份履行.比方帐单多算、产品没有拜托,大概库存不实等都有大概是部份完成的事件的后果.

支持事件处理的数据库可以将一组数据库代码封装在一个事件中,在事件履行期间的任何失利会让数据库回滚到事件开始之前的状况.

这是通过保护全部数据库操作的日记,以及其原始状况表的副本来实现的,在失利后下一次重新启动服务器时答应回滚操作. 这种时间和空间上的开销是事件安全数据库系统所必须的一种折衷.

单一MySQL服务器掌握着一系列数据库,它们都可以通过服务器以近似方法来拜候.每个数据库实际上都是一组肆意数目的表,概念与别的SQL数据库的用户近似.每个表都由带范例的数据列构成.数据可以是整数、实数值、字符串或别的范例,包含原始二进制流. 表中的每一行都是存储在数据库中的一个记录.

MySQL被计划和构造成客户机/服务器.服务器mysqld可以在能从因特网拜候到的任何机械上运行(最好与Web服务器在同一台或最接近的一台机械上,以确保公道的呼应时间).MySQL客户机利用恳求来与MySQL服务器接洽,改正或查询服务器所拥有的数据库.在支持数据库的Web利用程序中,数据库客户机是Web服务器或由Web服务器产生的CGI脚本.这些客户机可以用高级脚本语言或初级系统语言编写,只要存在这种语言的数据库API便可.在Linux中,大大都脚本语言是以C 实现的,因为存在MySQL C API,所以要将MySQL支持增添到任何现有的脚本语言或工具应当很简单.绝大部份脚本语言已经完成了这一步.

MySQL API

MySQL API可用于各种语言,包含几近全部编写网站后端所实际利用的语言. 利用这些API,我们可以构建由Web服务器掌握的 MySQL客户机.

API(用于数据库拜候)以基于衔接的情势工作.客户机必须做的第一件事是翻开与MySQL服务器的衔接.这包含适本地利用服务器熟习的用户名和口令来对衔接举行身份认证.成立了衔接后,服务器挑选要利用的特定数据库.肯定了初始化后,客户机利用程序(就我们来说是服务器方CGI脚本)就可以安闲地与数据库以两种方法中的一种举行交互:可以运行通例SQL号令,包含增添和删除表,以及向它们增添记录;也可以对返回后果的数据库运行查询.查询生成一组与查询匹配的记录,然后,客户机可以一一拜候记录,直到查看完好部记录,大概客户机撤消暂挂的记录检索.一旦脚本完成了对数据库的操作后,与服务器的衔接就被关闭.

要构建集成数据库拜候的网站,需求编写CGI脚本来按照数据库状况生成动态后果.Web服务器启动CGI脚本,然后将得当格局化的HTML输出到它们的尺度输出流中.Web服务器捕捉到HTML后将它发送回客户机,好像恳求是对静态HTML页面举行的那样. 在生成 HTML 的历程中,脚本可以改正数据库,也可以查询并将后果归并到它们的输出中.

作为简单注释上述历程的一个示例,下面的代码(以C和Tcl编写)查询一个包含某公司供贩卖的产品清单的数据库. 这绝没有利用两种语言MySQL API的全部特点,但供应了快速、简易扩大的示例,可以对数据库内容履行任何SQL号令. 在该例中,脚本显示了低于特定价钱的全部产品.在实践中,用户大概在Web浏览器中输入该价钱,然后将它发给服务器. 我们省去了从环境变量中举行读取来肯定 HTML 表单值的细节,因为它与不支持数据库的 CGI 脚本中履行的情形没有什么差别. 为清楚起见,我们假定事前设置了特定一些参数(比方要查询的价钱).

以下代码是利用免费得到的Tcl Generic Database Interface以Tcl实现的.这样一种接口的好处在于Tcl是注释型的,可以对代码举行疾速开辟和快速改正.

Tcl示例



#This code prints out all products in the database
# that are below a specified price (assumed to have been determined
# beforehand, and stored in the variable targetPrice)
# The output is in HTML table format, appropriate for CGI output

#load the SQL shared object library. the Tcl interpreter could also
#have been compiled with the library, making this line unnecessary
load /home/aroetter/tcl-sql/sql.so

#these are well defined beforehand, or they could
#be passed into the script
set DBNAME "clientWebSite";
set TBLNAME "products";
set DBHOST "backend.company.com"
set DBUSER "mysqluser"
set DBPASSWD "abigsecret"

set targetPrice 200;

#connect to the database
set handle [sql connect $DBHOST $DBUSER $DBPASSWD]
sql selectdb $handle $DBNAME ;# get test database

#run a query using the specified sql code
sql query $handle "select * from $TBLNAME where price <= $targetPrice"


#print out html table header
puts "<table border=4>"
puts "<th>Product Id <th width=200>Description <th>Price (\$)"

#output table rows - each fetchrow retrieves one result
#from the sql query
while {[set row [sql fetchrow $handle]] != ""} {
    set prodid [lindex $row 0]
    set descrip [lindex $row 1]
    set price [lindex $row 2]
    puts "<tr><td>$prodid <td align=center>$descrip <td>$price"
}

puts "</table>"

#empty the query result buffer - should already be empty in this case
sql endquery $handle
#close the db connection - in practice this same connection
#is used for multiple queries
sql disconnect $handle


下面的代码是利用正式MySQL C++ API MySQL++以C++编写的等价脚本.该版本的上风在于它是编译型的,因此比注释语言更快.常常用在特定站点的数据库代码应当以C或C++编写,然后由脚本或直接由Web服务器拜候,以改良整体运行时间.

C++示例



#include 
#include 
#include 

const char *DBNAME = "clientWebSite";
const char *DBTABLE = "products";
const char *DBHOST = "backend.company.com";
const char *DBUSER = "mysqluser";
const char *DBPASSWD = "abigsecret":

int main() {
  try {
    //open the database connection and query
    Connection con(DBNAME, DBHOST, DBUSER, DBPASSWD);
    Query query = con.query();

    //write valid sql code to the query object
    query << "select * from " << DBTABLE;

    //run the query and store the results
    Result res = query.store();

    //write out the html table header
    cout << "<table border=4>\n";
    cout << "<th>Product Id <th width=200>Description"
 << "<th>Price ($)" << endl;

    Result::iterator curResult;
 Row row;

    //iterate over each result and put it into an html table
    for (curResult = res.begin(); curResult != res.end(); curResult++) {
      row = *curResult;
      cout << "<tr><td align=center>" << row[0]
         << "<td>" << row[1]
         << "<td>" << row[2] << endl;

    }
    cout << "</table>" << endl;

  } catch (BadQuery er) {
    // handle a bad query (usually caused by a sql syntax error)
    cerr << "Error: " << er.error <<  endl;
    return -1;

  } catch (BadConversion er) {
//handle conversion errors out of the database as well
    cerr << "Error: Can't convert \"" << er.data << "\" to a \""
 << er.type_name << "\"." << endl;
    return -1;
  }
  return 0;
}


安全性

在Web上成立以Web支持的利用有一些开辟者需求考虑的问题.全部有关Web服务器上CGI程序的问题,比方Web服务器处理答应权和脚本方的输入查抄,也仍旧需求考虑.

除此之外,保护数据库系统的安全性也很有必要.这触及保护数据库服务器的答应权系统,以及使从数据库客户机到服务器的衔接安全.

MySQL供应了深化的安全性系统,有人描述它是"高级但不尺度".MySQL答应按照用户名、客户机主机和要拜候的数据库对客户机举行拜候.要成立安全的系统,让全部用户利用强口令,不要给他们任何他们不是绝对需求的拜候权.这包含表面上无害的特权,比方可以让用户查看全部正在运行的进程(包含更改其他用户口令的那些)的处理特权.最好的办法是以无特权的Unix用户运行服务器进程本身,这样假如一个数据库被泄露,也不至于击垮整个系统.这与以用户nobody而非root用户运行httpd近似. 描写系统拜候的表是作为单独的MySQL数据库存储的,可以由MySQL root用户更新. 请注意,MySQL服务器按照MySQL用户名授与特权,这些用户名与Unix用户名差别.不过,有一个MySQL root用户名,它对数据库有全部权限.一旦服务器肯定了衔接客户机是谁,以及它们在尝试衔接什么之后,就按照给定的一组权限来掌握拜候权.要避免拜候表中主机名被DNS电子拐骗,可以输入全部主机的IP地址,或恳求服务器将IP地址解析回原始主机名来使其他人截获DNS恳求和答复更艰难.

除了服务器拜候表以外,与服务器的通信也必须很安全.从客户机登录到服务器上时,口令不以纯文本方法发送;不过全部后续 SQL 号令将以纯文本方法发送.为到达更高的安全性,利用ssh来设置端口转发.它将服务器和客户机之间的全部通信举行加密,避免有人在传输中察看它.来自客户机的数据发送到客户机本地机械中本地ssh服务器所侦听的端口上.它由本地ssh服务器利用,加密后发送给远程ssh服务器,由它举行解密并转发到 MySQL服务器端口.

在实际中,最安全的办法是在 Web 服务器所在的机械上运行数据库服务器,并让由Web服务器产生的CGI脚本通过UNIX(本地)套接字与MySQL服务器举行通信.该设置可以让数据库管理员禁用全部与MySQL服务器的远程衔接.假如Web和数据库服务器必须位于差别的机械上,加密它们之间的全部通信,大概将两台机械通过其自己专用的、物理上断绝的网络衔接.只成立一个由Web服务器利用的用户帐户(除 root 用户外)以登录到数据库服务器.

由数据库驱动的网站是一些功效强盛的工具,可以让开辟者成立供应更新信息的动态站点,并让由客户机发动的更改在多个会话之间持续.后端数据库的利用关于管理电子贸易和别的利用的用户来说必不可少.通过利用可免费得到的软件,有大概成立由数据库驱动的站点,安全地将数据库连通性集成到站点现有的CGI体系构造中.   以上是“Linux利用集成MySQL数据库拜候本领[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • windows下的近似linux下的grep号令--findstr
  • linux下mysql链接被防火墙禁止的办理办法
  • Linux下mysql新建账号及权限设置办法
  • SUSE Linux下搭建Web服务器
  • Windows/Linux MySQL忘掉密码重置密码教程
  • Linux下Apache自动监测重启脚本(智能化程度较高)
  • linux备份 linux克隆 linux clone
  • <b>为什么 Linux不需求碎片整理</b>
  • CentOS6 yum搭建Linux+Nginx+PHP+MYSQL(LNMP)
  • Linux系统有效防备ARP攻击
  • Linux下 Memcache的安装和简单管理
  • 笔记本预装linux重装成windows系统
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .