django SQL注入安全整理

2016/5/31 posted in  python

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函数的应用,并查看此类函数的应用是否根据规范使用。