mysql语句转义,sql特殊字符转义(sql防注入)

具体方法

当sql where 条件等于一串特殊符号时候 就容易报错,切断,甚至不执行,或者造成数据库危险。
下面我们简单测试下
创建测试数据

 代码如下 复制代码

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 
INSERT INTO `user` VALUES ('1', ''\\'''\\\'');

如果我们通过这样的sql语句查询,是查不到的

 代码如下 复制代码

select * from user where name = "'\'''\'"

必须要经过转义后才能查询,这样才能查询到结果

 代码如下 复制代码

select * from user where name = "'\\'''\\\'"

有些人可能会想到用模糊查询比如like,但并不是一个很好的解决方案,导致查询不准确

那我们在执行sql之前要进行转义
但是 mysql_real_escape_string 和 mysql_escape_string 这样的转移函数 也并不是所有时候都靠谱。
这里我写了个php函数

 代码如下 复制代码

function escape($sql_str) {
    $search = array('\', '/', '"', "'", '|', '-', ';', '[', ']'); 
    $replace = array('\\', '\/', '\"', "\'", '\|', '\-', '\;', '\[', '\]');
    return str_replace($search, $replace, $sql_str);
}

在执行sql前进行一次特殊符号转义即可

 代码如下 复制代码

$sql = escape($sql);

 
另外对于php手册中get_magic_quotes_gpc的举例:

 代码如下 复制代码

if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST[‘lastname’]);
} else {
$lastname = $_POST[‘lastname’];
}

语句有四大句:select 、update、delete、insert,那么我们如果在我们提交的数据中进行过滤是不是能够避免这些问题呢?
于是我们使用正则就构建如下函数:

PHP代码

 代码如下 复制代码
    <?php          
    function inject_check($sql_str)    
    {    
    return eregi('select|insert|update|delete|'|    
    function verify_id($id=null)    
    {    
    if (!$id) { exit('没有提交参数!'); } // 是否为空判断    
    elseif (inject_check($id)) { exit('提交的参数非法!'); } // 注射判断    
    elseif (!is_numeric($id)) { exit('提交的参数非法!'); } // 数字判断    
    $id = intval($id); // 整型化         
    return $id;    
    }    
    ?>

呵呵,那么我们就能够进行校验了,于是我们上面的程序代码就变成了下面的:

PHP代码     

 代码如下 复制代码
    <?php    
    if (inject_check($_GET['id']))    
    {    
    exit('你提交的数据非法,请检查后重新提交!');    
    }    
    else    
    {    
    $id = verify_id($_GET['id']); // 这里引用了我们的过滤函数,对$id进行过滤    
    echo '提交的数据合法,请继续!';    
    }    
    ?>

但是我们有没有考虑过post提交的数据,大批量的数据呢?

比如一些字符可能会对数据库造成危害,比如 ' _ ', ' %',这些字符都有特殊意义,那么我们如果进行控制呢?还有一点,就是当我们的php.ini里面的magic_quotes_gpc = off的时候,那么提交的不符合数据库规则的数据都是不会自动在前面加' '的,那么我们要控制这些问题,于是构建如下函数:
PHP代码      

 代码如下 复制代码
<?php        
    function str_check( $str )    
    {    
    if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否打开    
    {    
    $str = addslashes($str); // 进行过滤    
    }    
    $str = str_replace("_", "_", $str); // 把 '_'过滤掉    
    $str = str_replace("%", "%", $str); // 把' % '过滤掉    
        
    return $str;    
    }    
    ?>

   

这样你只要再对php.ini与服务器进行安全配置了。

时间: 2024-10-26 21:19:38

mysql语句转义,sql特殊字符转义(sql防注入)的相关文章

asp sql安全过滤及防注入程序代码

'************************************************** '函数名:ReplaceBadChar '作  用:过滤非法的SQL字符 '参  数:strChar-----要过滤的字符 '返回值:过滤后的字符 '************************************************** function ReplaceBadChar(strChar)  if strChar="" then   ReplaceBadCh

mysql sql防注入简介与防注入实例

下面我们根据我编程序的经验来写一篇关于mysql教程 sql防注入简介与防注入实例吧. sql防注入简介: sql查询是一种用来数据与用户进行交互的文本语言,sql利用外部接将用户提交的数据发送给mysql数据库教程服务器进行处理,如果没有严密的过滤,可能导致数据丢失,如被删除,修改,而这样问题是网络管理员很难做事的,他们不能通过打系统被丁,或安装防火强可以控制了,. 下面我们来看一个简单的用户登陆实例. 一,创建用户表user create table user ( userid(int) n

万能写入sql语句,并且防注入

通过perpare()方法和检查字段防sql注入. $pdo=new PDO('mysql:host=localhost;dbname=scms', 'root' ); $_POST=array('title'=>23,'content'=>'kmm'); $keys= array_keys($_POST); /** * $filetarr数组用于规定只可以写入的字段 */ $filetarr=array('title','content'); $filtre=true; foreach ($

在MySQL数据库中使用C执行SQL语句

mysql|数据|数据库|语句|执行 与PostgreSQL相似,可使用许多不同的语言来访问MySQL,包括C.C++.Java和Perl.从Professional Linux Programming中第5章有关MySQL的下列章节中,Neil Matthew和Richard Stones使用详尽的MySQL C接口向我们介绍了如何在MySQL数据库中执行SQL语句.他们将讨论返回数据的语句,例如INSERT以及不返回数据的语句,例如UPDATE和DELETE.然后,他们将编写从数据库检索数据

在MySQL数据库中使用C执行SQL语句(1)

与PostgreSQL相似,可使用许多不同的语言来访问MySQL,包括C.C++.Java和Perl.从Professional Linux Programming中第5章有关MySQL的下列章节中,Neil Matthew和Richard Stones使用详尽的MySQL C接口向我们介绍了如何在MySQL数据库中执行SQL语句.他们将讨论返回数据的语句,例如INSERT以及不返回数据的语句,例如UPDATE和DELETE.然后,他们将编写从数据库检索数据的简单程序. 执行SQL语句 现在,我

在MySQL数据库中使用C执行SQL语句(2)

返回数据的语句 现在是时候讨论SQL的最普遍用法了,从数据库检索数据的SELECT语句. MySQL 还支持返回结果的SHOW.DESCRIBE和EXPLAIN SQL语句,但是这里不考虑它们.按惯例,手册中包含这些语句的说明. 您将会从PostgreSQL章记起,可以从PQexec中的SQL SELECT 语句检索数据,这里马上获取所有数据,或者使用游标从数据库中逐行检索数据,以便搞定大数据. 由于完全相同的原因,MySQL的检索方法几乎完全相同,虽然它实际上不用游标的形式描述逐行检索.但是,

MySQL开启记录执行过的SQL语句方法

  这篇文章主要介绍了MySQL开启记录执行过的SQL语句方法,配置的方法很简单,本文直接给出配置示例,需要的朋友可以参考下 概述 很多时候,我们需要知道 MySQL 执行过哪些 SQL 语句,比如 MySQL 被注入后,需要知道造成什么伤害等等.只要有 SQL 语句的记录,就能知道情况并作出对策.服务器是可以开启 MySQL 的 SQL 语句记录功能,从而就能间接地检测到客户端程序的行为. 方法 开启方法很简单:编辑/etc/my.cnf文件,在[mysqld]节下面添加:log=/var/l

mysql的查询sql语句转换成oracle的sql

问题描述 mysql的查询sql语句转换成oracle的sql SELECT CREATE_DATE SUM(ISBIND) AS ISBIND SUM(UNBIND) AS UNBIND SUM(SUBSCRIBE) AS SUBSCRIBE SUM(UNSUBSCRIBE) AS UNSUBSCRIBE FROM ( SELECT N.CREATE_DATE MAX( CASE N.EVENT WHEN 'subscribe' THEN COUNT ELSE 0 END ) SUBSCRIB

在MySQL数据库中使用C执行SQL语句的方法_Mysql

他们将讨论返回数据的语句,例如INSERT以及不返回数据的语句,例如UPDATE和DELETE.然后,他们将编写从数据库检索数据的简单程序 执行SQL语句 现在,我们已经有了一个连接,并且知道如何处理错误,是时候讨论使用我们的数据库来作一些实际工作了.执行所有类型的SQL的主关键字是mysql_query: int mysql_query(MYSQL *connection, const char *query) 正如您所见,它非常简单.它取一个指向连接结构的指针和包含要执行的SQL的文本字符串