SQL注入安全
所有的web形式的操作都需要注意sql注入安全事项。
Django字段查询
try:
room_id_get = request.GET.get('Room_ID')
result = SqlTest.objects.get(room_id=room_id_get)
except SqlTest.DoesNotExist:
…………
try:
room_id_get = request.GET.get('Room_ID')
result = SqlTest.objects.filter(room_id=room_id_get)
except SqlTest.DoesNotExist:
…………
在这两种通过字段直接get或者filter过滤的时候,将参数直接放入方法中,方法会为我们进行SQL注入过滤防护。
Django raw SQL查询
try:
room_id_get = request.GET.get('Room_ID')
result = SqlTest.objects.raw('select * from test_sql_injection_sqltest where room_id = %s ', [room_id_get] )
except SqlTest.DoesNotExist:
…………
使用这种查询方式的时候,要注意不能直接将参数写入raw中,需要以参数的形式封装,程序才会处理防止SQL注入,如果直接将字段放入where中,会引起SQL注入
直接调用底层数据库API
try:
room_id_get = request.GET.get('Room_ID')
cursor = connection.cursor()
cursor.execute('select * from test_sql_injection_sqltest where room_id = ?', [room_id_get])
result = cursor.fetchall()
except:
…………
使用这种方式的时候,需要注意同样要以参数的形式进行封装,而不要直接放入where中,这样既可以完成防止SQL注入。
总结
在进行Django的代码审计时,重点查找通过表单、URL或ajax传递过来的参数在作为查询条件(或后续有可能成为查询条件)的代码中是否存在objects.raw、objects.extra和cursor.execute函数的应用,并查看此类函数的应用是否根据规范使用。