⑴ 【python基础】django如何防止sql注入
python+Django 防止SQL注入
先看看那种容易被注入的SQL
id = 11001
sql = """
SELECT
id,
name,
age
FROM
student
WHERE
id = """+id+"""
"""
cursor = connection.cursor()
try:
cursor.execute(sql)
result = cursor.fetchall()
for result1 in result:
// 代码块
pass
finally:
cursor.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
一般来说写SQL语句在程序中,若有where条件一般都可能会去直接拼接,到那时这种方式容易被SQL注入,首先说明下什么是SQL的注入,简单来说就是你写的SQL被别人在页面上拼接了SQL。比如拼接1=1这种条件,如果登录接口被注入1=1那么就可以随意进入你的程序了。所以才要防止SQL的注入。
下面再来看看防止SQL的注入
id = 11001
params = []
sql = """
SELECT
id,
name,
age
FROM
student
WHERE
id = %s
"""
params.append(id)
cursor = connection.cursor()
try:
cursor.execute(sql, params)
result = cursor.fetchall()
for result1 in result:
// 代码块
pass
finally:
cursor.close()
我们把直接拼接的条件变量放入集合再把集合带入执行SQL的方法,就可以避免被注入的风险,在SQL的条件中使用%s进行站位,要注意的是这个%s是有顺序的,比如说上面这个SQL后面在跟一个条件name=%s那么下面的params集合也要多加一个元素params.append(name)这个时候name是在id后面的在集合中。这样可以一一对应,但如果要是把params.append(name)写在了params.append(id)前面SQL执行就会出现id=name and name = id 的条件就乱了,甚至还会报错。
使用connection完毕之后一定要记得close,connection是django.db中的,导入不要导入错了。
⑵ python写有没有动态sql的方法
python封装的sql驱动是最接近这玩意的东西。如果说只是想把语句分离出去,自己写个单独的.py然后import就好。这样做唯一的缺点在于,原本的占位符是不带名字的,有些影响可读性。如果使用各种模板、格式化合成,又有防注入上的缺失。
mybatis提供的两个主要功能,一是参数填入,而是良好的防注入。这两样在python这种动态语言里只是个单纯的sql驱动所做的事情。
到这份上,正解是自己写个小函数,以实现从keyword到占位符替换。或者直接用python-sql这种包去生成SQL语句。
⑶ 如何使用sqlmap进行sql注入
输入命令sqlmap -u + “风险网址” 检测是否存在sql注入漏洞。
看到返回了 服务器的类型,web环境,数据库类型。确定存在漏洞我们开始下一步的注入。根据返回的数据库类型我们确定数据库为access数据库。使用--tables 猜解表。
猜解完表格后我们进一步猜解表的内容。
命令 : python sqlmap.py -u URL -T admin --columns
注意 暴力破解的线程数 最大为10 ,其他的参数可以直接回车。
猜解完表的内容我们可以直接猜解表列的内容。
5
等待一段时间后,程序工作完毕,查看结果。
⑷ 用python如何去匹配sql注入出来的数据
除了
SUM还可以用
avg,
max,
min
SUM(3,
2)
等于5。
SUM("3",
2,
TRUE)
等于6,因为文本值被转换成数字,而逻辑值
"TRUE"
被转换成数字1。
不同于前例,如果
A1
包含
"3",而
B1
包含TRUE,则:SUM(A1,
B1,
2)
等于
2,因为对非数值型的值的引用不能被转换成数值。
如果单元格
A2:E2
包含
5,15,30,40
和
50,则:SUM(A2:C2)
等于50;SUM(B2:E2,
15)
等于
150。
运用SUM算余额
只要在D3输入好公式,下面的可以从D3单元格下拉复制格式:
同理适用于其他数据运算
⑸ Python常见的漏洞都有什么
首先是解析XML漏洞。如果您的应用程序加载和解析XML文件,那么您可能正在使用XML标准库模块。有一些针对XML的常见攻击。大多数是DoS风格(旨在破坏系统而不是窃取数据)。这些攻击很常见,尤其是在解析外部(即不受信任的)XML文件时。一种这样的攻击是“十亿笑”,因为加载的文件包含许多(十亿)“笑”。您可以加载XML实体文件,当XML解析器尝试将此XML文件加载到内存中时,它将消耗许多GB的内存。
要知道SSTI是ServerSideTemplateInjection,是Web开发中使用的模板引擎。模板引擎可以将用户界面和业务数据分离,逻辑代码和业务代码也可以相应分离,代码复用变得简单,开发效率也提高了。模板在服务器端使用,数据由模板引擎渲染,然后传递给用户,可以为特定用户/特定参数生成对应的页面。我们可以对比一下网络搜索,搜索不同词条得到的结果页面是不一样的,但是页面的边框基本是一样的。
⑹ 请教一个有关SQL漏洞的问题,python编程。
username输入为 “1 or 1=1”
那么,"SELECT status FROM Users WHERE username = '%s'" % username
将变成 "SELECT status FROM Users WHERE username = 1 or 1=1”
where条件不再起作用,返回所有的status。
⑺ 自动化 sql注入 工具怎么写
Sql注入测试一定要使用工具。原因一:工作效率;原因二:人工很难构造出覆盖面广的盲注入的sql语句。例如当一个查询的where字句包含了多个参数,or and的关系比较多时,简单的or 1=1, and 1=2是很难发现注入点的。
Sql注入的工具很多(Top 15 free SQL Injection Scanners),我最近使用的有Sqlmap,SqliX,JbroFuzz,Sql Power Injector, 网站啄木鸟.现将他们的使用方法和比较结果贴于此:
Sqlmap是python开发的SQL注入漏洞测试工具。没有UI界面的命令行工具。虽说是命令行工具,可他的使用比网站啄木鸟,Sql Power injector 容易多了,并且有很详细的帮助文档。从下面2个地址获得相关程序包:
⑻ php 开发中有效防御 SQL 注入攻击有哪些好方法
使用PDO或者MySQLi,有很多封装好的方便的Class。
例如使用PHP-PDO-MySQL-Class · GitHub(这个Class使用上比较类似Python的MySQLdb)的话,这样就是安全的:
<?php
$DB->query("SELECT * FROM fruit WHERE name IN (?)",array($_GET['pm1'],$_GET['pm2']));
$DB->query("SELECT * FROM users WHERE name=? and password=?",array($_GET['name'],$_GET['pw']));
?>
直接拼接字符串则是危险的:
<?php
$DB->query("SELECT * FROM fruit WHERE name IN ('".$_GET['pm1']."','".$_GET['pm2']."')");
$DB->query("SELECT * FROM users WHERE name='".$_GET['name']."' and password='".$_GET['pw']."'");
?>
PDO参数绑定的原理是将命令与参数分两次发送到MySQL,MySQL就能识别参数与命令,从而避免SQL注入(在参数上构造命令)。
mysql在新版本PHP中已经预废弃,使用的话会抛出错误,现在建议使用MySQLi或者MySQL_PDO。
⑼ python 怎么调用odbc
入门
连接到数据库
调用connect方法并传入ODBC连接字符串,其会返回一个connect对象。通过connect对象,调用cursor()方法,可以获取一个游标cursor。如下代码示例:
import pyodbc
#连接示例: Windows系统, 非DSN方式, 使用微软 SQL Server 数据库驱动
cnxn =pyodbc.connect('DRIVER={SQL Server};SERVER=localhost;PORT=1433;DATABASE=testdb;UID=me;PWD=pass')
#连接示例: Linux系统, 非DSN方式, 使用FreeTDS驱动
cnxn =pyodbc.connect('DRIVER={FreeTDS};SERVER=localhost;PORT=1433;DATABASE=testdb;UID=me;PWD=pass;TDS_Version=7.0')
#连接示例:使用DSN方式
cnxn = pyodbc.connect('DSN=test;PWD=password')
# 打开游标
cursor =cnxn.cursor()
以上示例只是标准示例,具体的ODBC连接字符串以你自己使用的驱动为准。
查询一些数据
所有SQL语句都使用Cursor.execute()方法执行。比如select语句会返回一些结果行,你可以使用游标(Cursor)相关的函数功能(fetchone,fetchall,fetchmany)对结果进行检索。
Cursor.fetchone 用于返回一个单行( Row)对象:
cursor.execute("selectuser_id, user_name from users")
row =cursor.fetchone()
if row:
print(row)
Row 对象是类似一个python元组(tuples),不过也可以通过列名称来访问,例如:
cursor.execute("selectuser_id, user_name from users")
row =cursor.fetchone()
print('name:',row[1]) # 使用列索引号来访问数据
print('name:',row.user_name) # 或者直接使用列名来访问数据
当所有行都已被检索,则fetchone返回None.
while 1:
row = cursor.fetchone()
if not row:
break
print('id:', row.user_id)
Cursor.fetchall方法返回所有剩余行并存储于一个列表中。如果没有行,则返回一个空列表。(注意:如果有很多行,会造成大量内存占用。Fetchall会一次性将所有数据查询到本地,然后再遍历)
cursor.execute("selectuser_id, user_name from users")
rows = cursor.fetchall()
for row in rows:
print(row.user_id, row.user_name)
如果并不在意数据处理时间,可以使用光标本身作为一个迭代器,逐行迭代。这样可以节省大量的内存开销,但是由于和数据来回进行通信,速度会相对较慢:
cursor.execute("selectuser_id, user_name from users"):
for row in cursor:
print(row.user_id, row.user_name)
由于Cursor.execute总是返回游标(cursor), 所以也可以简写成:
for row incursor.execute("select user_id, user_name from users"):
print(row.user_id, row.user_name)
我们可以在execut中使用”””三重引号,来应用多行SQL字符串。这样sql的可读性大大增强。这是python特有的特性:
cursor.execute(
"""
select user_id, user_name
from users
where last_logon < '2001-01-01'
and bill_overe = 1
""")
SQL参数
ODBC支持使用问号作为SQL的查询参数占位符。可以在execute方法的SQL参数之后,提供SQL参数占位符的值:
cursor.execute(
"""
select user_id, user_name
from users
where last_logon < ?
and bill_overe = ?
""", '2001-01-01', 1)
这样做可以防止SQL注入攻击,提高安全性。如果使用不同的参数反复执行相同的SQL它效率会更高,这种情况下该SQL将只预装(prepared )一次。(pyodbc只保留最后一条编写的语句,所以如果程序在语句之间进行切换,每次都会预装,造成多次预装。)
Python的DB API指定参数应以序列(sequence)对象传递,所以pyodbc也支持这种方式:
cursor.execute(
"""
select user_id, user_name
from users
where last_logon < ?
and bill_overe = ?
""", ['2001-01-01', 1])
插入数据
插入数据使用相同的函数 - 通过传入insert SQL和相关占位参数执行插入数据:
cursor.execute("insertinto procts(id, name) values ('pyodbc', 'awesome library')")
cnxn.commit()
cursor.execute("insertinto procts(id, name) values (?, ?)", 'pyodbc', 'awesome library')
cnxn.commit()
注意:调用cnxn.commit()。发成错误可以回滚。具体需要看数据库特性支持情况。如果数据发生改变,最好进行commit。如果不提交,则在连接中断时,所有数据会发生回滚。
更新和删除数据
更新和删除工作以同样的方式:通过特定的SQL来执行。通常我们都想知道更新和删除的时候有多少条记录受到影响,可以使用Cursor.rowcount来获取值:
cursor.execute("deletefrom procts where id <> ?", 'pyodbc')
print('Deleted {}inferior procts'.format(cursor.rowcount))
cnxn.commit()
由于execute 总是返回游标(允许你调用链或迭代器使用),有时我们直接这样简写:
deleted =cursor.execute("delete from procts where id <> 'pyodbc'").rowcount
cnxn.commit()
注意一定要调用commit。否则连接中断时会造成改动回滚。
技巧和窍门
引号
于单引号SQL是有效的,当值需要使用单引号时,使用用双引号包围的SQL:
cursor.execute("deletefrom procts where id <> 'pyodbc'")
如果使用三重引号, 我们可以这样使用单引号:
cursor.execute(
"""
delete
from procts
where id <> 'pyodbc'
""")
列名称
Microsoft SQLServer之类的一些数据库不会产生计算列的列名,在这种情况下,需要通过索引来访问列。我们也可以使用sql列别名的方式,为计算列指定引用名称:
row =cursor.execute("select count(*) as user_count fromusers").fetchone()
print('{}users'.format(row.user_count)
当然也可以直接使用列索引来访问列值:
count =cursor.execute("select count(*) from users").fetchone()[0]
print('{}users'.format(count)
注意,上例的首列不能是Null。否则fetchone方法将返回None并且会报NoneType不支持索引的错误。如果有一个默认值,经常可以是ISNULL或合并:
maxid =cursor.execute("select coalesce(max(id), 0) fromusers").fetchone()[0]
自动清理
连接(默认)在一个事务中。如果一个连接关闭前没有提交,则会进行当前事务回滚。很少需要finally或except 语句来执行人为的清理操作,程序会自动清理。
例如,如果下列执行过程中任何一条SQL语句出现异常,都将引发导致这两个游标执行失效。从而保证原子性,要么所有数据都插入发生,要么所有数据都不插入。不需要人为编写清理代码。
cnxn =pyodbc.connect(...)
cursor = cnxn.cursor()
cursor.execute("insertinto t(col) values (1)")
cursor.execute("insertinto t(col) values (2)")
cnxn.commit()
⑽ python怎么防止sql注入
最简单最容易的是限制用户输入。简单点的就是不允许用户输入单引号 和 --,因为单引号号--在SQL中都是影响执行的,两种方式一种是在JSP中加判断。
另一种是在SQL拼接是对单引号和--等进行转义,例如:str = str.replace("'", "''");
等等,还有其他很多方法。