所谓SQL注入就是经过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串(注入本质上就是把输入的字符串变成可执行的程序语句),最终达到欺骗服务器执行恶意的SQL命令。具体来讲,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它能够经过在Web表单中输入(恶意)SQL语句获得一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。在Web应用漏洞中,SQL Injection 漏洞的风险要高过其余全部的漏洞。html
根据相关技术原理,SQL注入能够分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是因为程序员对输入未进行细致地过滤,从而执行了非法的数据查询。python
SQL注入的产生缘由一般表如今如下几方面:mysql
常见的就是进行登陆验证的时候,表单提交的数据包含sql语句,代码以下程序员
login.html:简单的表单登陆正则表达式
<h1>欢迎登录<h1> <from method='post' > <input type='text' name='username' > <input type='text' name='password'> <input type="submit" value="当即登陆" > </form>
views.py:对表单进项获取以后,直接转换为SQL语句进行数据数据库查询。sql
from django.shortcuts import render, HttpResponse, redirect from django.views.generic.base import View class LoginNotSafeView(View): def get(self, request): return render(request, 'login.html') def post(self, request): user_name = request.POST.get("username", "") pass_word = request.POST.get("password", "") import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='mxonline',charset='utf8' ) cursor = conn.cursor() # 黑客可经过user或者password输入数据库语句对数据非法利用 sql_select = " select * from users_userprofile where username='{0}' and passworf='{1}' ".format(user_name, pass_word) result = cursor.execute(sql_select) for i in cursor.fetchall(): # 数据库全部查询结果 pass
若是想username框中填写admin,password为123
上面sql_select = " select * from users_userprofile where username='{0}' and passworf='{1}'
就至关于select * from users_userprofile where username=admin and passworf=123
进行查询
可是
若是想username框中填写admin or admin=admin #,password为123
若是想username框中填写admin,password为123
上面sql_select = " select * from users_userprofile where username='{0}' and passworf='{1}'
就至关于select * from users_userprofile where username=admin or admin = admin # and passworf=123
进行查询
这里的#至关于把后面的全部查询包括password查询给注释,而且 or admin = admin
的查询永远是正确的,因此sql攻击注入就完成了数据库