Ima*_*ehi -1 mysql django sql-injection python-3.x django-1.11
我用它来验证:
class MyValidationForm(forms.Form):
title = forms.CharField()
body = forms.Textarea()
taxonomy = forms.IntegerField()
Run Code Online (Sandbox Code Playgroud)
这是我基于类的视图:
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")
Run Code Online (Sandbox Code Playgroud)
就像你看到我在这一行检查我收到的请求验证:if not form.is_valid():它的工作,但当我SQL-command在我的表单输入中添加一些.它不会阻止在数据库中插入值!..意味着我在数据库中有一个字段,其中包含一些值select * from user where 1=1!它不会导致用户输入的SQL注入危险吗?...
您误解了SQL注入的含义.Django已成功保护您免受此类攻击,该字符串"select * from user where 1=1"被视为数据,而不是命令,最终作为数据库中的值.
SQL注入攻击会更改数据库正在执行的SQL.成功的攻击会使数据库成为执行数据的命令.您最终不会将其select * from user where 1=1作为一个值,但最终您最终会让攻击者访问该user表中的所有结果.
一个典型的错误是通过将SQL命令构造为字符串而无法正确转义数据.让我们说服务器使用以下查询来查找当前用户的数据:
SELECT * FROM user WHERE username='$user_id'
Run Code Online (Sandbox Code Playgroud)
其中$user_id来自请求.通常,这是一个登录名,比方说
user_id = "zopatista"
Run Code Online (Sandbox Code Playgroud)
所以查询变成了
SELECT * FROM user WHERE username='zopatista'
Run Code Online (Sandbox Code Playgroud)
如果服务器无法防止SQL注入攻击,则攻击者可以替换user_id并注入更多SQL命令:
user_id = "zopatista' OR 1=1 -- "
Run Code Online (Sandbox Code Playgroud)
只需将该字符串插入查询后,服务器就会将以下SQL发送到数据库:
SELECT * FROM user WHERE username='zopatista' OR 1=1 -- '
Run Code Online (Sandbox Code Playgroud)
突然,查询命令的含义发生了变化,数据库将返回所有行,而不是只返回与登录名匹配的一行.
SQL注入的经典XKCD笑话更进了一步,注入了删除整个表的 SQL代码,而不是尝试访问更多信息.
防止SQL注入的服务器将确保始终对用户提供的数据进行参数化,将数据与查询分开发送到数据库驱动程序,以确保它永远不会被视为查询的一部分.
只要您使用Django的模型和查询集,您就可以免受SQL注入攻击.如果您混合使用extra()或RawSQL()使用用户数据而不使用其参数功能,则只会面临风险.
| 归档时间: |
|
| 查看次数: |
2344 次 |
| 最近记录: |