首页 > 数据库 >SQL注入

SQL注入

时间:2024-07-02 22:33:33浏览次数:17  
标签:数据库 SQL value replace 参数 sql 注入

  1. SQL注入介绍
    结构化查询语言(SQL)主要用于与数据库交互的文本语言,SQL Injection就是利用某些数据库的外部接口将用户数据插入到实际的数据库操作语言中,从而达到入侵数据库乃至操作系统的目的,主要由于程序对用户输入的数据没有进行严格的过滤,导致非法数据库查询语句执行。
    SQL注入攻击具有很大的危险,可以利用它读取、修改或者删除数据库内的数据,获取数据库中的用户名和密码等敏感信息,甚至可以获得数据库员的权限,SQL Injection也很难防范,无法通过安装系统补丁或进行简单的安全配置进行自我保护,一般防火墙也无法拦截SQL Injection攻击。

    http://127.0.0.1/user.php?username=angel' or '1=1
    这样的SQL可以登录系统。因为添加了一个恒等。
    http://127.0.0.1/user.php?username=angel' /*
    http://127.0.0.1/user.php?username=angel' #

    在SQL中,"/*","#" 可以将后面的语句注释掉。

  2. PrepareStatement+Bind-variable
    对Java、JSP开发的应用,可以使用PrepareStatement+Bind-variable来防止SQL注入,
    php5开始,扩展mysqli中支持PrepareStatement,在使用这类语言作为数据库开发时,强烈建议使用PrepareStatement+Bind-variable来实现,尽量不要使用拼接的SQL。

  3. 使用应用程序提供的转换函数
    mysql c api:使用mysql_real_escape_string() API调用。
    mysql++ :使用escape和quote修饰符。
    php : 使用mysqli,支持PrepareStatement.
    perl DBI :使用placeholders或者quote方法。
    ruby DBI:使用placeholders或者quote方法。

    pymysql为例, 它在执行sql前,会对sql中的特殊字符进行转义,如

字符转义:
def escape_string(value, mapping=None):
"""escape_string escapes value but not surround it with quotes.

    Value should be bytes or unicode.
    """
    if isinstance(value, unicode):
        return _escape_unicode(value)
    assert isinstance(value, (bytes, bytearray))
    value = value.replace('\\', '\\\\')
    value = value.replace('\0', '\\0')
    value = value.replace('\n', '\\n')
    value = value.replace('\r', '\\r')
    value = value.replace('\032', '\\Z')
    value = value.replace("'", "\\'")
    value = value.replace('"', '\\"')
    return value

执行sql的正确方法,不要在sql中拼接参数,字符转义只会针对参数args

execute(query, args=None)

django/sqlalchemy
orm框架都是使用pymysql/MySQL-python等库,并且都使用execute(query,args)调用,将sql与参数分开传入。

sql注入检测工具
sqlmap

  1. 自定义函数进行校验
    如果现有转换函数仍然不能满足要求,需要自己编写函数进行输入效验,输入验证是一个很复杂的问题,输入验证的途径可以分为以下几种:
    整理数据使之变得有效。
    拒绝已知的非法输入 。
    只接受已知的合法输入。
    采用正则表达式来对用户提供的输入数据进行严格的检测和验证。

function safeRequest ($ParaName,$ParaType)
{
/---传入参数----/
/* ParaName:参数名称-字符型/
/
ParaType:参数类型-数字型(1表示参数是数字或字符,0表示参数为其他)/
if ($ParaType == 1)
{
$re = “/[^\w+$]/”;
}
else
{
$re = “/(|\’ | (%27)|;|(%3b)|=|(%3d)|(|(%28)|)|(%29)|(/
)|(%2f%2a)|(\ */)|(%2a%2f)|+|(%2b)|<|(%3c)|>|(%3e)|(--)|[|%5b|]|%5b)/”;
}
if (preg_match($re,$PareName)>0)
{
echo (“参数不符合要求,请重新输入!”);
return 0;
}
else
{
return 1;
}
}

标签:数据库,SQL,value,replace,参数,sql,注入
From: https://www.cnblogs.com/rcsy/p/18280661

相关文章

  • Mysql MVCC多版本解析
    1.首先各行数据,都有一个trx_id(事务ID)和回滚指针,形成一个链表数据结构的数据。其实这便是undo.log(回滚日志)2.当select查询数据的时候,还会生成视图数据。其中包含未提交的最小事务、未提交事务ID数组、应该分配下一个的事务ID、创建视图的事务ID首先会生成readview,将未提交的事......
  • 慢sql问题分析与总结
    慢SQL问题是指在数据库查询中执行时间过长(通常超过预期阈值,比如100毫秒)的SQL语句。这些长时间运行的查询可能会严重影响系统的响应速度和用户体验。对慢SQL问题的分析和总结主要包括以下几个步骤:识别问题:首先,使用数据库性能监控工具(如MySQL的EXPLAIN、SQLServer的Profiler......
  • MySQL-15.锁
    C-15.锁事务的隔离性由本章讲述的锁来实现。1.概述锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(比如订单,金额等),我们就需要保证这个数据在任何时刻最多只有一个线程在......
  • WebAPI项目框架仓储模式+导入SqlSuag
    仓储(Respository)是对数据库访问的一个封装解决方案新建Respository文件夹,新建类库Web.Core.IRepository,Web.Core.Repository解决方案新建Services文件夹,新建类库Web.Core.IServices,Web.Core.Services在类库Web.Core.Model下面新建Entity文件夹SqlSugar是国人开发者开发的一......
  • MySQL5.7&8.0权限-角色管理
    数据控制语言(DataControlLanguage,DCL)用于用户权限的管理,包括了GRANT与REVOKE命令。授权(GRANT)MySQL有很精细的权限控制:服务器级 ---->DB级----------->表----------------->列 ------------------>对象,存储过程,视图等mysql.user  mysql.db   mysql.tables_......
  • Spring Boot 中 PGSQL 判断打卡点是否经过轨迹优化代码,循环查询物理表修改生成临时表,
    记录一下一个业务问题,流程是这样的,我现在有一个定时任务,5分钟执行一次,更新车辆打卡的情况。现在有20俩车,每辆车都分配了路线,每条路线都有打卡点,每个打卡点分配了不同的时间段,也就是说,一条路线可能有几百个打卡点,这几百个打卡点中每一个都分配了时间段,有可能是1个时间段,比如8......
  • 【MySQL】mysql访问
    mysql访问1.引入MySQL客户端库2.C/C++进行增删改3.查询的处理细节4.图形化界面访问数据库4.1下载MYSQLWorkbench4.2MYSQLWorkbench远程连接数据库点赞......
  • mysql语句大全-工作中常用整理(欢迎大家在评论区继续补充)
    1.NOTEXISTS和NOTINSELECTCOUNT(ca.aaa)FROMxxcaWHERENOTEXISTS(SELECTlabel.*FROMxxxlabelWHERElabel.aaa=ca.aaa) SELECTCOUNT(ca.aaa)FROMxxcaWHEREca.aaaNOTIN(SELECTlabel.aaaFROMxxxlabelWHERElabel.aaa=ca.aaa) 2.查询表结......
  • MDX的魔法:探索SQL Server中的多维表达式
    ......
  • 基于springboot用“异常处理器“捕获解决“数据库信息录入重复“的问题“SQLIntegrity
    前言 当我们编写后端时,会遇到一个问题,那就是:假如A用户向我们的数据库录入完登录信息后(姓名,账号等),B用户同样采用了一个相同的姓名提交了登录信息,那这个时候就不满足username的唯一约束,此时数据库就会报错例如报错如下:Duplicateentry'····'forkey'····'提示......