每个语言都有自己的数据库框架或库,无论是哪种语言,哪种库,它们在数据库防注入方面使用的技术原理无外乎下面介绍的几种方法。

一、特殊字符转义处理

Mysql特殊字符指在mysql中具有特殊含义的字符,除了%_是mysql特有的外,其他的和我们在C语句中接触的特殊字符一样。

特殊字符 转义字符 特殊意义
\0 \\0 字符串结束符NUL
' \' 单引号
" \" 双引号
\b \\b 退格
\n \\n 换行
\r \\r 回车
\Z \\Z Control+Z
\ \\ 反斜杠
% \% 百分号,模糊查询中匹配任意个任意字符
_ \_ 下划线,模糊查询中匹配单个任意字符

mysql C API提供了mysql_real_escape_string函数对转义字符进行处理,但根据实际经验,在使用该API时会产生诸多问题。

因此自己实现了一个类似的函数:

std::string MysqlEscapeString(const std::string &strSql) {
size_t iSrcSize = strSql.size();
std::string strDest;
for (size_t i = 0; i < iSrcSize; i++) {
char ch = strSql[i];
switch (ch)
{
case '\0':
strDest.append("\\0");
break;
case '\n':
strDest.append("\\n");
break;
case '\r':
strDest.append("\\r");
break;
case '\'':
strDest.append("\\'");
break;
case '"':
strDest.append("\\\"");
break;
case '\\':
strDest.append("\\\\");
break;
case '%':
strDest.append("\\%");
break;
case '_':
strDest.append("\\_");
break;
default:
strDest.append(1, ch);
break;
}
} return strDest;
}

对于%_这2个只在模糊查询条件中有特殊含义,而在普通字符串中没有其他含义的字符,需要根据字符使用在SQL语句中的具体位置来决定是否需要处理。如我们要查询memberName包含t_st的用户信息:

select * from member where memberName like '%t_st%;

如果不对_进行转义处理则会查询出:

test
tast
tbst
t_st

二、Prepared SQL Statement(预处理语句)

SET @sql = "SELECT * FROM member WHERE memberName like ?";
SET @param = '%t_st%'; PREPARE stmt FROM @sql;
EXECUTE stmt using @param;
DEALLOCATE PREPARE stmt;

使用这种方法需要注意以下2点:

  1. ?占位符不能用在字符串中,上面例子如果写成下面这样是错误的。
SET @sql = "SELECT * FROM member WHERE memberName like '%?%'";
SET @param = 't_st'; PREPARE stmt FROM @sql;
EXECUTE stmt using @param;
DEALLOCATE PREPARE stmt;
  1. EXECUTE stmt USING @param;中使用的@param变量,是会话级别的变量。该变量的作用域至整个连接,连接断开之后该变量才会释放。重复使用相同变量时要留意了。

Mysql数据库防SQL注入原理的更多相关文章

  1. php和mysql数据库防SQL注入的有效解决办法

    <?php$mysqli = new mysqli("localhost", "my_user", "my_password", &q ...

  2. 回头探索JDBC及PreparedStatement防SQL注入原理

    概述 JDBC在我们学习J2EE的时候已经接触到了,但是仅是照搬步骤书写,其中的PreparedStatement防sql注入原理也是一知半解,然后就想回头查资料及敲测试代码探索一下.再有就是我们在项 ...

  3. PDO防sql注入原理分析

    使用pdo的预处理方式可以避免sql注入. 在php手册中'PDO--预处理语句与存储过程'下的说明: 很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作是想要运行的 SQL 的 ...

  4. 【Hibernate实战】源码解析Hibernate参数绑定及PreparedStatement防SQL注入原理

        本文采用mysql驱动是5.1.38版本. 本篇文章涉及内容比较多,单就Hibernate来讲就很大,再加上数据库驱动和数据库相关,非一篇文章或一篇专题就能说得完.本文从使用入手在[Spr ...

  5. 数据库防sql注入

  6. JDBC及PreparedStatement防SQL注入

    概述 JDBC在我们学习J2EE的时候已经接触到了,但是仅是照搬步骤书写,其中的PreparedStatement防sql注入原理也是一知半解,然后就想回头查资料及敲测试代码探索一下.再有就是我们在项 ...

  7. 【荐】PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项

    我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...

  8. mysql之数据库连接的方法封装及防sql注入

    一.定义数据库和表 create database animal; CREATE TABLE `pet` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name ...

  9. PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项

    我们都知道,只要合理正确使用PDO(PDO一是PHP数据对象(PHP Data Object)的缩写),可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_ ...

随机推荐

  1. 在ASP.NET MVC中利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。

    正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的'好'东西记 ...

  2. 国内网站遭遇SYN攻击事如何及时解决问题

    1.SYN/ACK Flood攻击:这种攻击方法是经典最有效的DDOS方法,可通杀各种系统的网络服 务,主要是通过向受害主机发送大量伪造源IP和源端口的SYN或ACK包,导致主机的缓存资源被耗 尽或忙 ...

  3. b.控制结构

    1. if/ if... else...与java 相同. 2.while/ do while 用法与java 相同,返回值始终为Unit. 3.for循环终于有自己的风格,如下: // <- ...

  4. ubuntu下helloworld内核模块编译

    1.hello.c #include<linux/init.h> #include<linux/module.h> MODULE_LICENSE("Dual BSD/ ...

  5. [BZOJ 3319] 黑白树

    3319: 黑白树 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 557  Solved: 194[Submit][Status][Discuss] ...

  6. Handler实现线程之间的通信-下载文件动态更新进度条

    1. 原理 每一个线程对应一个消息队列MessageQueue,实现线程之间的通信,可通过Handler对象将数据装进Message中,再将消息加入消息队列,而后线程会依次处理消息队列中的消息. 2. ...

  7. Vmware虚拟机安装win7系统教程

    第一步:下载虚拟机 可以下载VMware虚拟机,这里用的是Vmware12专业版,百度网盘直通车密码:c3mt密钥:5A02H-AU243-TZJ49-GTC7K-3C61N 第二部:安装 第三部:做 ...

  8. 带有WS-Security验证的webservice

    示例用的是spring+CXF来配置webservice 首先是web.xml配置,将spring,CXF的配置文件加载进去,由于我客户端跟服务端在同一个工程里面,所以配置文件在一块. <con ...

  9. ubuntu下统计目录及其子目录文件个数

    查看某目录下文件的个数 ls -l |grep "^-"|wc -l 或 find ./company -type f | wc -l 查看某目录下文件的个数,包括子目录里的. l ...

  10. 在linux环境下安装Node

    liunx安装node的方法 cd /usr/src //node 安装的位置   一 : 普通用户: 安装前准备环境: 1.检查Linux 版本 命令: cat /etc/redhat-releas ...