首页 > 数据库 >详解Web应用安全系列(1)注入漏洞之SQL注入

详解Web应用安全系列(1)注入漏洞之SQL注入

时间:2024-06-20 16:34:25浏览次数:23  
标签:语句 Web sql user SQL password where 注入

  注入漏洞通常是指在可输入参数的地方,通过构造恶意代码,进而威胁应用安全和数据库安全。常见的注入漏洞包括:SQL注入和XSS跨站脚本攻击。 这篇文章我们主要讲SQL注入,SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

一,攻击案例

  1. 添加' or 1=1#获取全部数据

比如在系统的用户登录页面,用户在前端页面上输入用户名和密码后提交,应用后台可能执行了下面这样一条sql语句。
var userName= Request.Form["user_name"]; var passwd= Request.Form["password"]; var sql = "select * from user where username='"+userName+"' and password='"+passwd+"' ";

上面的变量user_name和password的值是由用户提交的,正常情况下,如果用户输入用户名admin和密码123456,那么sql语句是这样的。

select * from user where username='admin' and password='123456';

似乎看起来一切正常。

但是如果用户在用户名处输入'or 1=1#呢,那么实际的sql语句就变成这样了。
select * from user where username='' or 1=1#' and password='123456';

因为#符号在sql中是注释符,所以sql server会忽略#后面的语句,因此上面的sql语句等价于:

select * from user where username='' or 1=1

因为1=1是个恒等条件,因此上面的sql语句便变成了下面的语句,查询出了全部用户。

select * from user
  1. 添加';drop table user#删除数据表

如果说上面的案例还看不出危险,那么如果用户在用户名处输入';drop table user#呢,那么实际的sql语句就变成这样了。
select * from user where username='';drop table user#' and password='123456';

因为#符号在sql中是注释符,因此上面的sql语句等价于:

select * from user where username='';drop table user

看出危险了吗,数据库会执行两条sql语句,第一条是一个带where条件的查询语句,第二条执行了drop table删除数据表的操作,最终会导致整个数据表被删除,如果数据库没有做好备份,会直接导致数据丢失,非常严重。

二,防范措施

通过前面两个案例我们可以看到,SQL注入发生的前提是应用程序直接相信和使用了用户的输入。那么我们有哪些防范措施呢。
  1. 对用户输入进行转义

永远不要相信用户的输入,对特殊字符(‘ “ \ <> & *)进行转义处理。如果是使用.net,可以使用System.Net.WebUtility.HtmlEncode(string)将用户输入值中包含的特殊字符转义掉。
var userName= HtmlEncode(Request.Form["user_name"]); var passwd= HtmlEncode(Request.Form["password"]); var sql = "select * from user where username='"+userName+"' and password='"+passwd+"' ";
  1. 参数化查询

除了对用户输入进行转义之外,数据库也提供了参数化查询的功能来防止SQL注入,参数化查询的原理是:在使用参数化查询的情况下,数据库服务器不会将参数的内容视为sql指令的一部份来处理,而是在数据库完成 sql 指令的编译后,才套用参数运行,因此就算参数中含有具有损的指令,也不会被数据库所运行。 目前主流的数据库都支持参数化查询,包括:SQL Server,MySQL,Oracle,SQLite和Access。 参数化查询代码示例如下:
Private bool ProtectLogin(string userName, string password)
{
    SqlParameter[] parameters = new SqlParameter[]
    {
        new SqlParameter{ParameterName="@UserName",SqlDbType=SqlDbType.NVarChar,Size=10,Value=userName},
        new SqlParameter{ParameterName="@Password",SqlDbType=SqlDbType.VarChar,Size=20,Value=password}
    };
    int count = (int)SqlHelper.Instance.ExecuteScalar
        ("SELECT COUNT(*) FROM Login WHERE UserName=@UserName AND Password=@password", parameters);
    return count > 0 ? true : false;
}
  1. 限制web应用的数据库操作权限

上面两种方案是比较常用的,除此之外,还可以限制web应用的数据库操作权限,比如把drop table等比较高危的操作权限拿掉,只给必需的最小权限。   另外,我最近开发并开源了一个支持免费申请通配符SSL证书的平台:华迅FreeCert,解决了每隔一段时间就要重新申请和部署证书(因为传统的云厂商提供的免费证书一般只有三个月有效期),不支持免费申请通配符证书这两大痛点,欢迎大家注册使用并提供宝贵意见。

标签:语句,Web,sql,user,SQL,password,where,注入
From: https://www.cnblogs.com/mcgrady/p/18258929

相关文章

  • MySQL计算两个地理坐标点之间的球面距离
    st_distance_sphere函数是mysql5.7提供的,可以直接查询两个经纬度之间相距多少米,它接受两个参数,每个参数是一个点的经度和纬度表结构:CREATETABLE`video_alarm`(`alarm_id`char(50)NOTNULL,`alarm_type`varchar(20)DEFAULTNULLCOMMENT'预警类型',`alarm_t......
  • 使用mysqlbackup备份工具加密备份
    1.生成keyecho-n"123456"|shasum-a2568d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92-#注意后面的中划线不算,共64个字符2.方式1:使用key#备份mysqlbackup--defaults-file=/etc/my.cnf--backup-dir=/tmp/fullbak--backup-image=/......
  • Centos7安装mysql8.21
                                                      Centos7安装mysql8.21一、缷载maridb,一般centos都会预装maridb,这个可能会与mysql冲突,先卸载它#查看是否自带maria......
  • 软件测试入门基础03-MySQL
    前言:这是我个人的学习记录,我是科班在读有一定基础,很多东西不会特别详细,欢迎大佬指点,也很高兴有人看了能得到帮助这一小节的内容是MySQL,我已经修完数据库,但时间久远忘记许多于是又看了一遍做个笔记。印象中数据库挺简单,简单的说就是增删改查。我修这门课时把实验做完基本上知......
  • MySQL 常用函数总结
    MySQL提供了丰富的内置函数,用于在查询中进行各种计算、字符串处理、日期和时间操作等。这些函数可以帮助我们更有效地从数据库中检索和处理数据。下面将总结一些MySQL中常用的函数及其用法。1.数值函数1.1ROUND()ROUND()函数用于对数值进行四舍五入操作。SELECTR......
  • 5.21实验三 Web数据库程序设计
    一、实验目的通过使用JSP技术设计一个简单的数据库管理系统,了解展示页面和编辑页面的区别,掌握Web服务器与MySQL数据库的连接和数据库操作的方法,掌握使用Java语言编写JSP文件的方法。二、实验内容和基本要求从以下列举的四个数据库中,任选其一,或者自行定义其他数据库,每个数据库中......
  • 5.23实验二 SQL 语言的使用
    一、实验目的:掌握使用SQL语言进行各种查询的操作和视图的操纵方法。二、实验要求:在现有的数据库上进行各种查询操作,对视图的创建、使用等操作。三、实验步骤:1、开始→程序→MicrosoftSQLServer→SQLServerManagementStudio。2、在“连接到服务器”对话框中,选择......
  • 下载MySQL时无法修改存储路径及几个问题
    文章目录前言一、没办法修改下载路径二、只下载了MySQL却没办法可视化总结前言今天在下载MySQL的时候,出现了几个小问题,记录在这里,供大家参考一、没办法修改下载路径我相信这个是大家最头疼的问题,发现根据教程下载的时候出现的选项不是五个,就和图下面这个样子一样......
  • MySQL-Day3
    学习目标写SQL三步法边写边运行,否则后面出错时候会难以排查搭框架基本的select语句框架建起来,如果有多表,把相应的多表联合起来看条件决定where后面的显示的字段select后面的内容连接查询内连接两张表相同地方select*from 左/右连接包括内连接以及左/右部......
  • MySQL-Day4
    学习目标MySQL的内置函数concat拼接字符串函数把12,34,‘ab’,拼接成‘1234ab’selectconcat(12,34,'ab')length返回字符串字符的个数计算字符串长度‘abc’selectlength('abc')返回3一个utf-8,一个汉字表示3个长度selectlength(‘我和you’) 返回9内置函数可以......