0

0

sql注入实例以及如何防sql注入

零下一度

零下一度

发布时间:2017-05-09 13:29:58

|

1842人浏览过

|

来源于php中文网

原创

概述

  sql注入就是利用某些数据库的外接接口将用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。在安全领域,我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。没有(运行时)编译,就没有注入。所以从根本上防止上述类型攻击的手段,还是避免数据变成代码被执行,时刻分清代码和数据的界限。而具体到sql注入来说,被执行的恶意代码是通过数据库的sql解释引擎编译得到的,所以只要避免用户输入的数据被数据库系统编译就可以了。
  与其他数据库不同,mysql可以运行在不同的sql mode(sql服务器模式)下,并且可以为不同客户端应用不同模式。这样每个应用程序可以根据自己的需求来定制服务器的操作模式。模式定义mysql应支持哪些sql语法,以及应执行哪种数据验证检查。这有点类似于apache配置不同级别的错误日志,报告哪些错误,又不报告哪些错误。

SQL注入

1.注入实例

//php代码
$unsafe_variable = $_POST['user_input'];   
mysql_query("INSERT INTO `table` (`column`) VALUES ('{$unsafe_variable}')");

当post中代码如下时候:

value'); DROP TABLE table;--

查询代码变成

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

这样会直接删除table表,你的数据被破坏了。

2.防止sql注入

方法一
prepareStatement+Bind-Variable:SQL语句和查询的参数分别发送给数据库服务器进行解析。
对于php来说有两种实现方式。

//使用PDO(PHP data object)
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');  
$stmt->execute(array('name' => $name));  
foreach ($stmt as $row) {  
    // do something with $row  
}

//使用mysql扩展-mysqli
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with $row
}

方式二
对查询语句进行转义(最常见的方式):使用应用程序提供的转换函数
|应用|函数|

|--------|
|MySQL C 
API
|
mysql_real_escape_string
()|
|MySQL++|escape和quote修饰符|
|PHP|使用mysql_real_escape_string()(适用于PHP4.3.0以前),之后可以使用mysqli或pdo|
|
Perl
 DBI|placeholder或quote()|
|Ruby DBI|placeholder或quote()|

方式三
使用自己定义函数进行校验:其本质上还是对输入非法数据进行转义和过滤。
输入验证可以分为:1.整理数据使之有效;2.拒绝已知的非法输入;3.只接收已知的合法输入。

方式四
使用存储过程
存储过程参见: (9)mysql中的存储过程和自定义函数

sql服务器模式

1.sql模式语法

#查看当前sql模式
select @@sql_mode;
#查看当前sql模式
SELECT @@session.sql_mode;
#修改当前sql模式
SET [SESSION][GLOBAL] sql_mode='modes';
  • 其中session选项表示只在本次连接生效;而global表示在本次连接不生效,下次连接生效。

  • 也可以使用“--sql-mode='modes'”,在MySQL启动时候设置sql_mode。

  • 可以在数据库操作0中设置。

    2.sql_mode常用值

    ONLY_FULL_GROUP_BY:
    对于GROUP BY数据库操作1操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。

NO_AUTO_VALUE_ON_ZERO:
该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。

STRICT_TRANS_TABLES:
在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制。

Shoping购物网源码
Shoping购物网源码

该系统采用多层模式开发,这个网站主要展示女装的经营,更易于网站的扩展和后期的维护,同时也根据常用的SQL注入手段做出相应的防御以提高网站的安全性,本网站实现了购物车,产品订单管理,产品展示,等等,后台实现了动态权限的管理,客户管理,订单管理以及商品管理等等,前台页面设计精致,后台便于操作等。实现了无限子类的添加,实现了动态权限的管理,支持一下一个人做的辛苦

下载

NO_ZERO_IN_DATE:
在严格模式下,不允许日期和月份为零。

NO_ZERO_DATE:
设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

ERROR_FOR_pISION_BY_ZERO:
在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL。

NO_AUTO_CREATE_USER:
禁止GRANT创建密码为空的用户。

NO_ENGINE_SUBSTITUTION:
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常。

PIPES_AS_CONCAT:
将"||"视为数据库操作2的连接数据库操作3而非或数据库操作4,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似。

ANSI_QUOTES:
启用ANSI_QUOTES后,不能用双引号来数据库操作5字符串,因为它被解释为识别符。

说明

ORACLE的sql_mode设置等同:PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER。

【相关推荐】

1. 数据库操作6

2. 数据库操作7

3. 数据库操作8

相关专题

更多
javascript void运算符
javascript void运算符

void是一元运算符,执行右侧表达式但始终返回undefined;用于丢弃返回值、阻止a标签跳转、IIFE忽略结果、动态导入不取Promise、安全获取undefined。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

vscode的界面字体大小调整
vscode的界面字体大小调整

调整VSCode界面字体大小可通过设置编辑器或整体UI缩放实现;2.修改"Editor:FontSize"改变代码字体;3.设置"Window:ZoomLevel"调整整体界面字体;4.使用Ctrl+滚轮快捷键临时缩放。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

VSCode的注释快捷键
VSCode的注释快捷键

单行注释快捷键为Ctrl+/(Windows/Linux)或Cmd+/(macOS),块注释使用Shift+Alt+A(Windows/Linux)或Shift+Option+A(macOS),VSCode会根据语言类型自动匹配语法,如JavaScript用//,Python用#,C++用//,若快捷键无效需检查语言扩展或插件冲突。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

Golang 命令行工具(CLI)开发实战
Golang 命令行工具(CLI)开发实战

本专题系统讲解 Golang 在命令行工具(CLI)开发中的实战应用,内容涵盖参数解析、子命令设计、配置文件读取、日志输出、错误处理、跨平台编译以及常用CLI库(如 Cobra、Viper)的使用方法。通过完整案例,帮助学习者掌握 使用 Go 构建专业级命令行工具与开发辅助程序的能力。

4

2025.12.29

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

165

2025.12.26

压缩文件加密教程汇总
压缩文件加密教程汇总

本专题整合了压缩文件加密教程,阅读专题下面的文章了解更多详细教程。

56

2025.12.26

wifi无ip分配
wifi无ip分配

本专题整合了wifi无ip分配相关教程,阅读专题下面的文章了解更多详细教程。

108

2025.12.26

漫蛙漫画入口网址
漫蛙漫画入口网址

本专题整合了漫蛙入口网址大全,阅读下面的文章领取更多入口。

356

2025.12.26

b站看视频入口合集
b站看视频入口合集

本专题整合了b站哔哩哔哩相关入口合集,阅读下面的文章查看更多入口。

703

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号