你对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与用户数据而不使用其参数功能。