防止django表单中的SQL注入

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注入危险吗?...

Mar*_*ers 8

您误解了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()使用用户数据而不使用其参数功能,则只会面临风险.