SQL注入漏洞代码分析

1.代码分析

HTML代码

<form action="#" method="GET"><input type="text" name="id"><input type="submit" name="Submit" value="Submit">
</form>action=“#”,将数据提交到当前页面。

PHP代码分析

if(isset($_GET[‘Submit’])){ 		//判断Submit变量是否存在$id = $_GET[‘id’]; 		//获取id变量的值并赋值给变量$id$getid = "SELECT first_name, last_name FROM users WHERE user_id = ‘1’ and ‘1’=‘1'"; //将select查询语句赋值给变量$getid
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); //mysql_query()函数执行mysql查询//die() 函数输出一条消息,并退出当前脚本。//mysql_error() 函数返回上一个 MySQL 操作产生的文本错误信息。//or之前的语句执行不成功时,才会执行后面的语句。//and之前的语句执行成功时,才会执行后面的语句。

mysql_query()函数

mysql_query()如果是执行查询之类的语句(select),那么会返回一个资源标识符,也就是我们要查找的数据结果集;mysql_query()如果是执行增删改之类的语句,返回的就是true或者false了。

PHP代码分析

$num = mysql_numrows($result); 		//返回结果集中行的数目$i = 0; while ($i < $num) { $first = mysql_result($result,$i,"first_name"); 	//返回结果集中first_name字段的值$last = mysql_result($result,$i,"last_name"); 	//返回结果集中last_name字段的值echo '<pre>'; echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>surname: ' . $last; echo '</pre>'; $i++; } 

2.漏洞分析

SQL注入分类

按照所传递的数据类型分类: 数字型注入 SELECT first_name, last_name FROM users WHERE user_id= id字符型注入SELECTfirstn​ame,lastn​ameFROMusersWHEREuseri​d=′id‘ 无论何种类型,都可以通过直接输入单引号来判断是否存在注入点。 可以分别输入3和1+2,根据显示结果来判断数据类型。

字符型注入

字符型注入最关键的是如何闭合SQL语句以及注释多余的代码。

SELECT first_name, last_name FROM users WHERE user_id = ’1 ‘or 1=1 or ‘ '
’ or 1=1 or ‘		假 or 真 or 假1’ or ‘1’=‘1		真 or 真’ or 1=1 #		假 or 真’ or 1=1 -- 		假 or 真

手工MySQL注入流程

’ union select 1,2 #
’ union select user(),database() #
‘ union select table_name,2 from information_schema.tables where table_schema='dvwa' #
‘ union select column_name,2 from information_schema.columns where table_name='users' #
‘ union select user,password from users #

3.漏洞防御

如何防御SQL注入

SQL注入漏洞的形成原因:用户构造的语句被代入到数据库中执行。

防御SQL注入的首要原则:用户的一切输入都是有害的,或是说不被信任的。

防御SQL注入的主要方法:对用户输入的数据进行过滤。

medium级别的防御措施

$id = $_GET['id']; 
$id = mysql_real_escape_string($id); 使用mysql_real_escape_string()函数对用户输入的id参数进行了过滤。可以将单引号【'】、双引号【"】、反斜杠【\】、空字符【null】等进行转义。
转义是把指定的字符转换成无意义的符号,比如PHP解析器不会把经过转义的引号当成引号来看待。PHP中另一个功能类似的函数:addslashes()

medium级别的漏洞

$getid = "SELECT first_name, last_name FROM users WHERE user_id = $id"; 注入类型变成了数字型,mysql_real_escape_string()函数过滤无效。

high级别的防御措施

$id = $_GET['id']; $id = stripslashes($id); $id = mysql_real_escape_string($id); stripslashes()函数的作用是删除由 addslashes() 函数添加的反斜杠,也就是去除addslashes()函数的转义。

magic_quotes_gpc魔术引号

在PHP配置文件php.ini中存在magic_quotes_gpc选项,被称为魔术引号。

在high级别下,PHP的magic_quotes_gpc被自动设为on。

开启之后,可以对所有的GET、POST和COOKIE传值的数据自动运行addslashes()函数

关闭魔术引号

修改C:\Windows\php.ini文件magic_quotes_gpc = Off

重启Apache服务

high级别的防御措施

if (is_numeric($id)){ $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; 在执行查询之前,使用了if语句进行判断,判断的条件是is_numeric()函数。
判断用户输入的数据是否是数字型,只要不是数字型就一概报错。
and、or、select等语句都无法执行。

如何从代码层面防范SQL注入

对于数字型注入,可以使用if语句,并以is_number()函数作为判断条件进行防御。

对于字符型注入,对用于接收用户参数的变量,用mysql_real_escape_string()、addslashes()等函数进行过滤。

SQL注入的防范措施

代码层面 1.对输入进行严格的转义和过滤; 2.使用参数化查询。

网络层面 1.通过WAF进行防护; 2.云端防护:安全狗、360网站卫士、阿里云盾等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/2773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hbase java API与过滤器

一、Hbase java API&#xff1a; 1、创建一张表 2、删除一张表 3、向一张表中添加一条数据 4、向一张表中同时添加一批数据 5、获取一条数据 6、获取一批数据 7、创建预分region表 代码实现&#xff1a; import org.apache.hadoop.conf.Configuration; import org.apa…

Spring boot + MyBatis-Plus3

学习 增删改查 在 service 层直接调用。 insert(user) 增selectById(1) 根据id查updateById(user) 更新selectByMap(map) 根据条件查selectBatchIds(list) 根据多个id查selectPage(page, null) 分页查deleteById(1) 删除id为1的用户deleteByMap(map) 删除符合条件的用户d…

【C++】日期计算机

个人主页&#xff1a;救赎小恶魔 欢迎大家来到小恶魔频道 好久不见&#xff0c;甚是想念 今天我们要讲述的是一个日期类计算机的代码实现 引言&#xff1a; 我们日常生活中可能会有一个烦恼。 今天几月几号&#xff1f;过n天后又是几月几号&#xff1f;某年某月某天和x年…

MySQL你想知道序列当前生成的值,你可以使用SHOW TABLE STATUS命令或者查询information_schema数据库

在MySQL中&#xff0c;如果你想知道序列当前生成的值&#xff08;例如&#xff0c;自增主键的当前值&#xff09;&#xff0c;你可以使用SHOW TABLE STATUS命令或者查询information_schema数据库。 使用SHOW TABLE STATUS命令&#xff1a; 这个命令可以显示关于表的各种信息&…

比特币中的符文是什么?

比特币中的符文是什么&#xff1f; 比特币符文是存在于比特币区块链上的独特的、可替代的代币。它们旨在代表具有独特特征和元数据的可替代资产。 Ordinals 协议的创建者 Casey Rodamor 最近放弃了一项替代 BRC-20 可替代代币协议的提案&#xff0c;该替代方案被称为 Runes。 破…

【k8s】Kubernetes 1.29.4离线安装部署(总)

&#xff08;一&#xff09;kubernetes1.29.4离线部署之-安装文件准备 &#xff08;二&#xff09;kubernetes1.29.4离线部署之-镜像文件准备 &#xff08;三&#xff09;kubernetes1.29.4离线部署之-环境初始化 &#xff08;四&#xff09;kubernetes1.29.4离线部署之-组件安装…

掌握Linux Shell脚本函数:提高脚本效率与可维护性

目录标题 1、什么是Shell函数&#xff1f;2、如何定义Shell函数&#xff1f;3、Shell函数参数4、返回值5、实例&#xff1a;使用函数进行文件备份6、为什么使用函数&#xff1f;7、最佳实践 在编写Linux shell脚本时&#xff0c;函数是组织和重用代码的重要手段。本文将介绍如何…

Python实现定时任务的八种方式

在实际的软件开发过程中,经常需要执行定时任务,比如定时备份数据、定时发送邮件、定时清理缓存等。Python作为一种功能强大的编程语言,提供了多种方式来实现定时任务。本文将介绍Python实现定时任务的八种常用方法,并提供相应的代码示例。 1. 使用​​time.sleep()​​函数…

rt1052 模拟hard fault

uint32_t u32Addr ((uint32_t)0x5FFFFFFF); //定义一个单片机不存在的地址 uint32_t u32StackTop *((__IO uint32_t *)u32Addr); //读取这个不存在的地址 //会进入 void HardFault_Handler(void) 中断

现货白银价格走势分析别走弯路!

参与现货白银投资离不开对其价格走势的分析&#xff0c;虽然相关的分析方法有很多种&#xff0c;但说到直观高效的方法&#xff0c;技术分析就是很多专业投资者所钟爱的选择。投资者可以通过平台交易软件所自带的技术指标和画线工具&#xff0c;来辅助自己的分析&#xff0c;实…

移动端js事件、zeptojs、swiper、bootstrap、正则表达式、前端性能优化

移动端场景下的js事件&#xff0c;制作移动端特效常用的js库&#xff0c;介绍移动端常用开发框架Bootstrap 一、移动端js事件 移动端的操作方式和PC端是不同的&#xff0c;移动端主要用手指操作&#xff0c;所以有特殊的touch事件&#xff0c;touch事件包括如下几个事件&…

前缀和 求数列的子序列的K倍区间

(直接截图比复制文字要好多了) 不会做的时候我去看了之前做的关于这道题目的笔记&#xff0c; &#xff08;Ak 1&#xff09;% k 1 &#xff08;Ak 1 Ak&#xff09;% k 1 只要发现了同余数的情况就说明有一个区间满足了题目的要求。 这个方法的精妙之处就在于前缀和包括了…

嵌入式Linux driver开发实操(二十一):linux device driver basic设备驱动程序基础

linux的架构框图: 内核空间是内核(即操作系统的核心)执行(即运行)并提供其服务的地方。 用户空间是执行用户应用程序的地方。 内核模块是可以根据需要加载和卸载到内核中的代码片段。它们扩展了内核的功能,而无需重新启动系统。自定义代码可以通过两种方法添加到Linux内…

C++ —— 继承

什么是继承&#xff1f; 继承是指一种代码可以被复用的机制&#xff0c;在一个类的基础上进行扩展&#xff0c;产生的新类叫做派生类&#xff0c;被继承的类叫基类。&#xff08;也可称为子类和父类&#xff09; 继承的写法&#xff1a; class B : 继承方式 A (…

Java高级阶段面试题库(Redis数据库、MQ消息队列、kafka、SpringBoot + SpringCloud、MySQL、JVMJUC、其它)

文章目录 1. Redis数据库篇(忽略)1.1 简单介绍一下redis1.2 单线程的redis为什么读写速度快?1.3 redis为什么是单线程的?1.4 redis服务器的的内存是多大?1.5 为什么Redis的操作是原子性的&#xff0c;怎么保证原子性的&#xff1f;1.6 你还用过其他的缓存吗&#xff1f;这些…

学习Django

1.python安装是会有几个主要目录&#xff1a; 2.如果某个路径加入了环境变量&#xff0c;那么在命令行直接输入他下面的文件就能找到&#xff0c;不用输入完整路径 2.过程 &#xff08;1&#xff09;安装 &#xff08;2&#xff09;建项目 在终端&#xff1a; &#xff08;…

快速回复app是什么样

在电商领域&#xff0c;掌握一些必备的软件工具是提高工作效率、优化运营流程以及提升用户体验的关键。本文将为您介绍做电商必备的几个软件&#xff0c;帮助您更好地开展电商业务。 ​ 快速回复APP&#xff1a;重新定义沟通效率 在快节奏的现代社会中&#xff0c;人们对于沟通…

ZeRO论文阅读

一.前情提要 1.本文理论为主&#xff0c;并且仅为个人理解&#xff0c;能力一般&#xff0c;不喜勿喷 2.本文理论知识较为成体系 3.如有需要&#xff0c;以下是原文&#xff0c;更为完备 Zero 论文精读【论文精读】_哔哩哔哩_bilibili 二.正文 1.前言 ①为什么用该技术&…

性能测试工具一——gprof(采样测试与插桩测试结合的混合测试)

gprof只适用于Linux平台&#xff0c;不支持MacOS和Windows。 使用前提&#xff1a;在编译指令中加入-pg即可。也可添加其它编译选项&#xff0c;但-pg是核心&#xff0c;-Og -g -pg或-D NDEBUG -Og -g -pg。 例如在Makefile中g -Og -g -pg。或在CMakeLists.txt中set(CMAKE_CX…

Linux网络设置

将Linux主机接入到网络&#xff0c;需要配置网络相关设置 一般包括&#xff1a;主机名&#xff1b;IP/netmask&#xff1b;路由&#xff1a;默认网关&#xff1b;DNS服务器&#xff1a;主DNS服务器&#xff0c;次DNS服务器&#xff0c;第三个DNS服务器 网卡的配置文件在&…