sql注入相关知识

1.概述

昨天面试被问了sql注入相关的问题,不会,只有自己来学习了

SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。

原文链接:https://www.jianshu.com/p/dc7f63e46f4c

举个简单的例子:正常的查询语句:select * from table where username = xxx and password = xxx ,如果再登录中不做处理,这样写用户名:
'or 1 = 1 -- 这样的话,密码不写,则查询语句则变成了select * from table where username = '' or 1 = 1 -- and password = '' ,则是不需要密码就可以登录了
或者直接用户名这样填写:'; drop database mysql; 则直接将数据库删除

2. 应对方法

  • 再excute里面有一个参数args可以防止注入
    错误用法 :
    sql = "select * from table where id=%d and name=%s" %(id, name)
    正确用法:
    args = (id, name)
    sql = "select * from table where id=%d and name=%s"
    cursor.execute(sql, args)
  • 将字符串进行转义
def fun(s):
    value = s.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注入相关知识)