python - 需要帮助了解 Restful API 中的 SQL 注入(inject)漏洞

标签 python sqlite sql-injection flask-restful

我目前正在开发一个 Flask Restful API,它可以根据区域在一定距离内搜索医生。我想确切地知道它容易受到哪种 SQL 注入(inject)的攻击,因为 sqllite3 不允许在一条语句中使用多个命令。它有几个与之关联的不同表,但我已经在 API 代码中包含了相关的表以及 sqllite 查询的样子。 API 本身相当大,所以请原谅我没有发布整个内容。

from flask import Flask
from flask_restful import Api, Resource, reqparse
import sqlite3

app = Flask(__name__)
api = Api(app)

class fullname(Resource):
    def get(self, zipcode,distance,fname,lname):
        con = sqlite3.connect('DoctorZipLookup.db')
        with con:
            cur = con.cursor()
            cur.execute("SELECT Latitude, Longitude FROM Zipcodes WHERE Zip = " + zipcode)
            #does some math and finds zipcodes less than distance away
            cur.execute("SELECT * FROM Doctors WHERE Zip IN(SELECT Zip FROM closezipcodes) AND FirstName LIKE '" + fname + "%' AND LastName LIKE '" + lname + "%' ORDER BY Zip")
            cur.execute("SELECT * FROM Comments ORDER BY id")
            #put doctors and their comments in a JSON object and return it


api.add_resource(fullname, "/fullname/<string:zipcode>&<string:distance>&<string:fname>&<string:lname>")
app.run(debug=True)

我知道这样编写的查询很容易受到 SQL 注入(inject)的攻击,并且我一直在尝试一些示例,只是为了更好地理解它的工作原理。到目前为止,我还没有让它做很多事情。我在网上找到的大多数示例都包含 ;执行第二条语句并删除表或吐出更多信息。但是 sqlite3 不允许您同时执行 2 个语句,有没有办法解决这个问题并执行其他内容?或者,修改这样格式的单个语句实际上会造成什么危害? 到目前为止,我所想到的就是做类似的事情

import requests
zip = '27265 or Zip LIKE \'%\''
resp = requests.get('http://127.0.0.1:5002/fullname/' + zip + '&10&first&last')

这将导致邮政编码表吐出其所有内容。通过这种设置方式还能做什么?

最佳答案

你的问题似乎更多是在问SQL注入(inject)的风险是什么?我想说,了解风险的最简单方法是观看 Computerphile 制作的两个精彩视频 ( video 1 video 2 )。在使用它访问数据库之前,有很多方法可以清理您的输入。

关于python - 需要帮助了解 Restful API 中的 SQL 注入(inject)漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56530719/

相关文章:

java - 在Java中,如何删除Sqlite表

php - 如何防止 PHP 中的 SQL 注入(inject)?

python - 如何调用名称中包含空格的方法?

python - 在运行 fit_generator 时,可以在training_data_generator 中运行 "With tf.Session as sess:"吗?

python - 错误信息 "python-pylint ' C0103 :Invalid constant name"

python - cPanel 应用程序在 Python2 而不是 Python3 上运行

android - 在 onPostExecute 中关闭光标不会呈现任何内容

sqlite - 为什么SQLite的LIKE%在JOIN中不起作用?

php - htaccess 中的 mod_rewrite 是否有助于防止注入(inject)?

c# - 带有替换单引号和验证整数的 SQL 注入(inject)