防止 Django 表单中的 SQL 注入

2024-04-10

我用它来验证:

class MyValidationForm(forms.Form):
  title = forms.CharField()
  body = forms.Textarea()
  taxonomy = forms.IntegerField()

这是我基于阶级的观点:

class blog_createpost(dashboardBaseViews):

 template_name = "dashboardtems/blog_createpost.html"

 model = {}

 def post(self, request, *args, **kwargs):

    form = MyValidationForm(request.POST)

    if not form.is_valid():
        return HttpResponse("not valid")


    new_data = post(title=request.POST['title'],
                    body=request.POST['body'],
                    description=request.POST['description'],
                    taxonomy=get_object_or_404(taxonomy, 
                       pk=request.POST['taxonomy']),
                    writer=request.user)
    new_data.save()
    return HttpResponse("done")

就像你看到的,我在这一行检查收到的请求验证:if not form.is_valid():它正在工作,但是当我添加一些时SQL-command在我的表单输入中。它不会阻止将值插入数据库!... 意味着我在数据库中有一个字段,其中包含一些值,例如select * from user where 1=1!. 它不会导致用户输入的 sql 注入危险吗?...


你对SQL注入有什么误解means。 Django 已经成功地保护你免受这样的攻击,字符串"select * from user where 1=1"被视为data,不是作为命令,而是作为数据库中的值。

SQL注入攻击更改数据库正在执行的 SQL。成功的攻击会欺骗数据库将数据作为命令执行。你最终不会得到select * from user where 1=1作为一个值,但最终攻击者可以访问该值的所有结果user table.

一个典型的错误是没有通过将 SQL 命令构造为字符串来正确转义数据。假设服务器使用以下查询来查找当前用户的数据:

SELECT * FROM user WHERE username='$user_id'

where $user_id来自请求。通常这是一个登录名,比如说

user_id = "zopatista"

所以查询变成

SELECT * FROM user WHERE username='zopatista'

如果服务器不能防御 SQL 注入攻击,攻击者可以替换user_id and 注入更多SQL命令:

user_id = "zopatista' OR 1=1 -- "

因此,在简单地将字符串插入到查询中之后,现在服务器将向数据库发送以下 SQL:

SELECT * FROM user WHERE username='zopatista' OR 1=1 -- '

突然间查询命令的含义已更改数据库将返回all rows而不仅仅是与登录名匹配的一行。

The 关于 SQL 注入的经典 XKCD 笑话 https://xkcd.com/327/更进一步,注入 SQL 代码删除整个表,而不是试图获取更多信息。

防止 SQL 注入的服务器将确保用户提供的数据始终参数化的,将数据与查询分开发送到数据库驱动程序,以确保它永远不会被视为查询的一部分。

只要您使用 Django 的模型和查询集,您就可以免受 SQL 注入攻击。只有当你混合时你才会面临风险extra() https://docs.djangoproject.com/en/stable/ref/models/querysets/#django.db.models.query.QuerySet.extra or RawSQL() https://docs.djangoproject.com/en/stable/ref/models/expressions/#django.db.models.expressions.RawSQL与用户数据而不使用其参数功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止 Django 表单中的 SQL 注入 的相关文章

  • 如何更改Python使用的SQLite版本?

    我在 Debian 9 12 上安装了 Python 3 8 和 SQLite 3 16 2 并且需要升级到较新版本的 SQLite 我已经下载并编译了 SQLite 网站上提供的合并 并将其放入 usr bin 所以当我这样做时 sqli
  • 在 Python 中对非英语文本进行分词

    我有一个波斯语文本文件 其中包含如下几行 6 7 10 11 我想从这一行生成一个单词列表 对我来说 单词边框是数字 比如上面一行中的 6 7 等 还有 特点 所以列表应该是 我想在 Python 3 3 中执行此操作 最好的方法是什么 我
  • 用于添加和删除客户名称的 Web 表单出现问题

    我正在尝试创建一个 Web 表单 其中列出了所有客户 然后为您提供一个文本字段 旁边有一个按钮 您可以在其中添加客户 然后它应该显示客户列表 旁边有删除按钮 您可以单击该按钮从数据库中删除客户 我正在让它发挥作用 对于初学者来说 它会回显
  • 获取jdbc中表依赖顺序

    我在 MySQL 数据库中有一组表 A B C D 依赖关系如下 B gt C gt A 和 D gt A 也就是说 A 有一个 PrimaryKey C 有一个外键指向 A 的主键 B 有一个外键指向 C 的主键 类似地 D 有一个外键指
  • Linux 上的 Python 3.6 tkinter 窗口图标错误

    我正在从 Python GUI 编程手册 学习 Python GUI 某项任务要求我通过将以下代码添加到我的配方中来更改窗口图标 Change the main windows icon win iconbitmap r C Python3
  • _mysql_connector.MySQLInterfaceError:命令不同步;您现在无法运行此命令 python msql.connector

    我有一个功能 您可以在下面看到 如果运行此函数 我将收到您在标题中看到的错误 您能帮助我吗 不久前我能够用锁解决这个问题 但现在它们不起作用 我知道这与我的连接有关 但我不知道如何解决这个问题 def insertNewValues sel
  • 安全转义表名/列名

    我在 php 中使用 PDO 因此无法使用准备好的语句转义表名或列名 以下是我自己实现它的万无一失的方法 tn str replace REQUEST tn column str replace REQUEST column sql SEL
  • 让 Django 提供可下载文件

    我希望网站上的用户能够下载路径被遮挡的文件 因此无法直接下载它们 例如 我希望 URL 是这样的 http example com download f somefile txt 在服务器上 我知道所有可下载的文件都位于该文件夹中 home
  • 如何使用 django Rest 框架保存多对多字段对象

    我有博客 发布 标签三个模型 在博客模型中 我将字段 postedin 作为发布模型的外键 将 标签 作为标签模型的许多字段 模型 py class Posted models Model name models CharField Pos
  • django-tastypie:无法访问脱水中的bundle.request(self,bundle)

    我发现有人有同样的问题 但他的安慰对我不起作用 看Django Tastypie 如何访问 Bundle 中的 Http request 对象 https stackoverflow com questions 7389632 我正在尝试应
  • MySQL ALTER TABLE 挂起

    我知道这个问题已经被问过好几次了 但我的问题发生在我刚刚创建的表上 它只有 10 列和 1 行 因此 与通常的挂起问题不同 这不是具有大量数据的大表的情况 但它仍然挂着 这是我正在运行的 SQL ALTER TABLE db Search
  • 向 yahoo 和 hotmail 用户发送电子邮件?

    我正在使用 php 和 mysql 每次用户在我的网站上注册时 我都会使用 php mail 发送一封电子邮件进行身份验证 最近我发现 很多Yahoo和Hotmail用户还没有激活他们的帐户 假设 1000 个用户中 只有 200 个被激活
  • Django Channels Postgres InterfaceError:连接已关闭

    我似乎无法理解这里的问题 我正在为我的渠道消费者编写测试文档中的描述 https channels readthedocs io en latest topics testing html 我通常会使用 Django 默认的单元测试 但由于
  • 为什么 Clojure MySQL 查询结果中出现“M”

    我有一个返回一行的 Clojure 查询 下面是返回行 映射 的部分打印输出 employer percent 0 00M premium 621 44M 这两列在mysql表中分别是decimal 5 2 和decimal 7 2 为什么
  • 使用 Celery 通过 Gevent 进行实时、同步的外部 API 查询

    我正在开发一个 Web 应用程序 该应用程序将接收用户的请求 并且必须调用许多外部 API 来编写对该请求的答案 这可以直接从主 Web 线程使用 gevent 之类的东西来扇出请求来完成 或者 我在想 我可以将传入的请求放入队列中 并使用
  • Mysql:计算访问频率

    我有这张桌子 CREATE OR REPLACE TABLE hits ip bigint page VARCHAR 256 agent VARCHAR 1000 date datetime 我想计算每个页面的 googlebot 访问频率
  • 如何从 PyObject 获取指向字符串的 char*

    我怎样才能得到一个char from a PyObject它指向一个字符串 例如 这是 python 脚本 Test Connect 272 22 20 65 1234 这是 C 代码 static PyObject Connect PyO
  • MySQL 查询获取每小时计数

    我需要统计每小时发生的操作次数 我的数据库按操作的时间戳保存日志 我明白我可以做一个 SELECT table time COUNT table time from table t group by t time 然而 也有一段时间没有采取
  • 测验程序的 MySql 数据库设计

    我目前正在开发一个项目 主要是创建一个测验应用程序 它将能够进行包含 10 到 20 个问题的多项选择题或简答题的测验 它需要能够根据正确答案检查用户的答案 然后对用户的答案进行评分 稍后 我可能会实现一个后端功能来在线创建测验 但现在我将
  • 多个数据库连接

    我有三张桌子 categories content info and content The categories表包含类别的id及其 IDparent类别 The content info包含两列 entry id帖子的 ID 和cat

随机推荐

  • 在 Ubuntu 16.04 上安装 OpenCV 时出错

    我一直在尝试使用几个教程在 Ubuntu 16 04 上安装 OpenCV 但总是出现错误 这是我按照本教程得到的最后一个 https github com BVLC caffe wiki Ubuntu 16 04 or 15 10 Ope
  • Android VOIP 应用程序在 Doze 模式下的行为

    我正在 Android 上开发旧版 VOIP 应用程序 它目前不使用 Google Cloud Messaging 技术 只是永远保留自己的 TCP 连接 最近 谷歌推出了 Android M 预览版打瞌睡模式 https develope
  • UITextView beginOfDocument 返回 nil

    我必须获取包含在屏幕上的字符串的位置UITextView 为此 我尝试获取相应的 UITextPosition 问题是UITextView method beginningOfDocument回报nil 同样适用于endOfDocuemen
  • 如何在Python中从流(不是磁盘支持的文件)读取Excel文件?

    XLRD已安装并测试 gt gt gt import xlrd gt gt gt workbook xlrd open workbook Sample xls 当我通过如下所示的 html 表单读取文件时 我可以访问所有值 xls file
  • 我们如何解决 PagerTitleStrip 和 PagerTabStrip 中的空白标题?

    支持 v4 版本 23 0 0 的 PagerTitleStrip 和 PagerTabStrip 存在问题 的标题视图ViewPager使用时PagerTitleStrip or PagerTabStrip以及版本 23 0 0 用于 M
  • 如何使用Guice注射器?

    我正在学习Guice 但我不太清楚如何使用Injector实例 最好是创建Injector在应用程序引导程序上实例一次 并将其设为公共单例 我们是否总是必须使用Injector getInstance SomeClass class 去我们
  • 在 Android Studio 中使用 GameCircleSDK 时,多个 dex 文件定义了 Lcom/amazon/ags/BuildConfig

    我最近将 Android 项目从 Eclipse 导入到 AndroidStudio 中 一切都很顺利 我能够解决大多数问题 除了 GameCircleSDK 库模块的问题 我不断收到以下错误 UNEXPECTED TOP LEVEL EX
  • 如何获取文件 *.apk 在 Android 设备中的位置

    需要以编程方式从 Android 设备检索 apk 文件名的帮助吗 如果我只知道文件名的一部分 任何机构都可以提供一些 Android 方法来执行此操作 甚至可以在 Android 下运行 shell 命令来获取文件位置吗 另外 是否有一种
  • GroupBy 表达式翻译失败

    Model public class Application Key public int ApplicationId get set public DateTime CreatedAt get set public DateTime Co
  • 使用逻辑运算符进行 Laravel 表单验证

    当用户填写消息 文本区域 时 他 她无法填写日期 时间 地点值 仅当 Message 为空且所有这三个字段均已填充时 才会考虑这三个字段 如何使用 Laravel 表单验证来做到这一点 是否可以在Request的规则方法中定义这些逻辑 我是
  • 如何禁用部分 UISegmentedControl?

    以下是代码UISegmentedControl UISegmentedControl segmentedControl UISegmentedControl alloc initWithItems NSArray arrayWithObje
  • 来自 ISO8601 时间戳字符串的 Django 模型 DateTimeField

    这里是 Django 新手 我正在为带有字符串时间戳的 SQLite 数据库制作 Django 模型 例如2014 09 23T18 43 26 692Z 因为我想最终使用 Django 的过滤引擎进行查询 而不是使用strftime 我希
  • 如何获取故障转储

    我需要从程序中获取故障转储 我怎样才能得到它 该程序是用 C 编写的 故障转储到底是什么 它是什么时候创建的 它保存在哪里 我如何阅读它 既然你说的是 C 我假设你使用的是 Windows 平台 故障转储 或简称转储 是特定时间点进程的完整
  • Hibernate 抛出 HibernateQueryException:无法解析属性

    所以我有一个在休眠中定义为实体的表 如下所示 Entity Table name sec Preference public class Preference private long id Column name PreferenceId
  • 注册新成就:(#3502) 成就 URL 中的对象不是 game.achievement 类型

    我正在尝试为我的游戏添加新成就 当我尝试在 Graph API Explorer 上测试它时 我收到以下错误 3502 成就 URL 中的对象不是 game achievement 类型 我按照这篇文章 http developers fa
  • 在asp.net中使用doPostBack函数

    我想在我的链接中使用 doPostBack 函数 当用户单击它时 它不会重定向到另一个页面 并且页面将回发 我正在使用此代码 但它不起作用 我错过了哪里 lt a id Sample href javascript doPostBack P
  • 使用 GitHub 管理多个用户

    有人可以咨询我一件事吗 我们有一个项目 我们刚刚决定雇用更多程序员来完成它 到目前为止 我是唯一一个在 GitHub 上备份代码的程序员 但现在我需要找到一种安全的方法来管理多个程序员 因此 私有项目有一个主分支 其他程序员应该能够克隆它
  • 加载动态创建的 ASCX 控件(通过代码)

    我正在创造Web User Controls通过代码 我的 C 代码写出标记 代码隐藏和设计器文件在回调时写入磁盘 控件创建得很好 我可以将它们添加到我的网络项目中并将它们放在页面上 当我尝试使用加载控件时LoadControl path
  • 如何根据单元格值更改PHP中的单元格表格颜色?

    我刚刚开始使用 php 编程 我做了一个从数据库返回值的表 我正在尝试执行以下操作 根据第三列的值更改其颜色 我也是这么想的 但是数值重复了 而且颜色也不对 有人可以帮我吗 你明白我的问题了吗 谢谢你们 我带来的不便表示歉意 Code ta
  • 防止 Django 表单中的 SQL 注入

    我用它来验证 class MyValidationForm forms Form title forms CharField body forms Textarea taxonomy forms IntegerField 这是我基于阶级的观