所謂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攻擊注入就完成了數據庫