본문으로 바로가기

지난글에서 XSS가 무엇인지 알아봤다면 DRF환경에서 db에 저장될때 강제적으로 특수문자를 바꿔서 저장을 해서 막아볼 생각이다.


진행방식

평소에 사용하던 serializers.SerializerMethodField 를 사용해서 시리얼라이저를 통과할때 객체에 바뀐 content를 저장

escape 함수를 이용해서 변환

obj의 content만 찍히지 않아서 views에서의 작업해서 context로 serializer에 전달 (content가 찍히지 않는 이유는 read_only라 조회한 값만 사용가능하다고 생각)
serializer = ReviewCreateSerializer(data=request.data,context={'request':request})

escape함수를 활용해서 특수문자 변환

print(escape(self.context['request'].data['content']))

 

 

class ReviewCreateSerializer(serializers.ModelSerializer):
    content = serializers.SerializerMethodField()

    def get_content(self, validated_data):
        return escape(self.context['request'].data['content'])

 


하면 될 줄 알았다.

read_only 필드인걸 간과하고 create 하려고 했으니 안되는게 분명했다. serializer.data까지는 들어간게 찍혀도 저장이 되지 않았다.

그래서 create 함수를 활용해서 객체를 만들어 봤다.


 



결과적으로 context로 validated_data를 받아와서 객체를 db에 저장을했다.