Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django object.get(pk=sth),如何检查输入是否是恶意的_Django_Django Rest Framework - Fatal编程技术网

Django object.get(pk=sth),如何检查输入是否是恶意的

Django object.get(pk=sth),如何检查输入是否是恶意的,django,django-rest-framework,Django,Django Rest Framework,我希望通过以下路径查看我的用户的id: path('users/<int:pk>', views.UserDetail.as_view()), 在这种情况下,input(sth)将使用数据库中的所有id进行检查,以检查输入id是否存在,如果未找到,则返回错误。 问题是,如果用户输入的脚本导致数据库被擦除,我就不知道了。如何从一开始就检查id输入数据是否有效?您不必担心这些情况 更多信息:首先,祝贺您关注安全问题,这是许多“web开发人员”似乎完全忽视的问题——唉,对于我们最终用户

我希望通过以下路径查看我的用户的id:

 path('users/<int:pk>', views.UserDetail.as_view()),
在这种情况下,input(sth)将使用数据库中的所有id进行检查,以检查输入id是否存在,如果未找到,则返回错误。
问题是,如果用户输入的脚本导致数据库被擦除,我就不知道了。如何从一开始就检查id输入数据是否有效?

您不必担心这些情况


更多信息:

首先,祝贺您关注安全问题,这是许多“web开发人员”似乎完全忽视的问题——唉,对于我们最终用户来说

同时祝贺您选择了一个最安全的web框架——当然,没有任何代码可以保证完全安全,但是Django仅仅遵循官方记录的方法和最佳实践就可以保护您的站点免受大多数已知攻击向量的攻击(当然,假设您将所有内容(Django等)都保持最新,并且前端服务器配置正确),并且当检测到漏洞时,您也可以依赖频繁的安全版本。这里唯一要注意的是可能没有正确编码的第三方django应用程序,因此请坚持使用维护良好且拥有可靠用户基础的应用程序,甚至确保您浏览其源代码以查找可能的漏洞

现在请回答你的问题:

您的“sth”将首次由URLSolver(根据您的urlconf向视图发送http请求的部分)进行验证,并且给定
'users/'
定义,“users/”之后的任何内容都不是整数(当然,这与
\d+
regexp不匹配)将被拒绝,因此您的视图将永远不会执行

然后,即使是这样,
User.objects.get(pk=sth)
表达式也会被ORM自身第二次清除,如果
sth
对给定字段无效,ORM将引发错误,因此没有查询会进入数据库,您也可以自己检查:

>>> User.objects.get(pk="delete from auth_user")
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/query.py", line 376, in get
    clone = self.filter(*args, **kwargs)
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/query.py", line 796, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/query.py", line 814, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1227, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1253, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1187, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1083, in build_lookup
    return final_lookup(lhs, rhs)
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/lookups.py", line 19, in __init__
    self.rhs = self.get_prep_lookup()
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/lookups.py", line 59, in get_prep_lookup
    return self.lhs.output_field.get_prep_value(self.rhs)
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 946, in get_prep_value
    return int(value)
ValueError: invalid literal for int() with base 10: 'delete from auth_user'
>>User.objects.get(pk=“从auth\u用户中删除”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/home/bruno/.virtualenvs/blook/local/lib/python2.7/site packages/django/db/models/manager.py”,第85行,在manager\u方法中
返回getattr(self.get_queryset(),name)(*args,**kwargs)
get中第376行的文件“/home/bruno/.virtualenvs/blook/local/lib/python2.7/site packages/django/db/models/query.py”
clone=self.filter(*args,**kwargs)
文件“/home/bruno/.virtualenvs/blook/local/lib/python2.7/site packages/django/db/models/query.py”,第796行,在过滤器中
返回self.\u filter\u或\u exclude(False、*args、**kwargs)
文件“/home/bruno/.virtualenvs/blook/local/lib/python2.7/site packages/django/db/models/query.py”,第814行,在过滤器或排除中
clone.query.add_q(q(*args,**kwargs))
文件“/home/bruno/.virtualenvs/blook/local/lib/python2.7/site packages/django/db/models/sql/query.py”,第1227行,在add_q中
子句,self.\u添加(q\u对象,self.used\u别名)
文件“/home/bruno/.virtualenvs/blook/local/lib/python2.7/site packages/django/db/models/sql/query.py”,第1253行,在_add_q中
allow_joins=allow_joins,split_subq=split_subq,
文件“/home/bruno/.virtualenvs/blook/local/lib/python2.7/site packages/django/db/models/sql/query.py”,第1187行,内置过滤器
条件=self.build\u查找(查找、列、值)
文件“/home/bruno/.virtualenvs/blook/local/lib/python2.7/site packages/django/db/models/sql/query.py”,第1083行,内部版本查找
返回最终查找(左、右)
文件“/home/bruno/.virtualenvs/blook/local/lib/python2.7/site packages/django/db/models/lookups.py”,第19行,在__
self.rhs=self.get\u prep\u lookup()
文件“/home/bruno/.virtualenvs/blook/local/lib/python2.7/site packages/django/db/models/lookups.py”,第59行,在get\u prep\u lookup中
返回self.lhs.output\u字段。获取准备值(self.rhs)
文件“/home/bruno/.virtualenvs/blook/local/lib/python2.7/site packages/django/db/models/fields/\uuuuuu init\uuuuuuu.py”,第946行,在get\u prep\u值中
返回int(值)
ValueError:基数为10的int()的文本无效:“从身份验证用户中删除”
最后,即使1/您的url被定义为只接受任何参数,2/您在varchar或文本字段上执行查询,orm也会通过使用适当的数据库连接器模块,因此数据库连接器也会清理查询参数,防止SQL注入


如您所见,您实际上必须做出相当大的努力来绕过Django本身(本例中是URLSolver和ORM),故意错误地使用数据库连接器模块来打开应用程序进行SQL注入。

您可以尝试更改为
users.objects.filter(id=sth)
。如果此返回值为“无”,则表示数据库中不存在id,您可以执行任何操作,如引发异常或传递异常。如果找到,则它是正确的id输入,并且存在于数据库中database@NgocPham好的,但没有区别,输入数据将与数据库中的所有数据一起检查,如果不存在,则返回none。如果在此期间检查错误的输入会导致数据库被删除。我想在任何对象之前检查输入。get/filter Run如果您不执行对数据库的查询,我想不知道数据库中是否存在一个
id
。如果您担心在找到它后会有人删除它,请尝试锁定此表,不要有任何内容可以更新和删除delete@NgocPham你喜欢我吗在隔离级别选项中使用读取提交的隔离级别?感谢您的时间和完整答案:)
>>> User.objects.get(pk="delete from auth_user")
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/query.py", line 376, in get
    clone = self.filter(*args, **kwargs)
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/query.py", line 796, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/query.py", line 814, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1227, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1253, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1187, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1083, in build_lookup
    return final_lookup(lhs, rhs)
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/lookups.py", line 19, in __init__
    self.rhs = self.get_prep_lookup()
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/lookups.py", line 59, in get_prep_lookup
    return self.lhs.output_field.get_prep_value(self.rhs)
  File "/home/bruno/.virtualenvs/blook/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 946, in get_prep_value
    return int(value)
ValueError: invalid literal for int() with base 10: 'delete from auth_user'