我正在使用Django休息框架。我已经编写了以下视图来向系统注册新用户。
@api_view(['POST'])
@csrf_exempt
@permission_classes((AllowAny, ))
def create_user(request):
email = request.DATA['email']
password = request.DATA['password']
try:
user = User.objects.get(email=email)
false = False
return HttpResponse(json.dumps({
'success': False,
'reason': 'User with this email already exists'
}), content_type='application/json')
except User.DoesNotExist:
user = User(email=email, username=email)
user.set_password(password)
user.save()
profile = UserProfile(user=user)
profile.save()
profile_serialized = UserProfileSerializer(profile)
token = Token(user=user)
token.save()
return HttpResponse(json.dumps({
'success': True,
'key': token.key,
'user_profile': profile_serialized.data
}), content_type='application/json')
是否有更好,更安全的方法,在DRF中创建一个用户注册api,不会让端点对sql注入开放?
答案 0 :(得分:2)
请原谅我一点点离题,但我不禁想知道,如果您创建了一个序列化程序并使用了基于类的视图,那么使用的代码可能会少得多。此外,如果您刚刚创建了电子邮件作为序列化程序的EmailField,它将自动保证电子邮件的验证。由于您使用的是orm接口,因此我认为sql注入的风险比原始查询要小得多。
示例代码: -
class UserList(CreateAPIView):
serializer_class = UserSerializer
class UserSerializer(ModelSerializer):
email = serializers.EmailField()
raw_password = serializers.CharField()
这些方面有些东西,显然我无法编写完整的代码。
答案 1 :(得分:0)
您可以使用validate-email-address
模块验证序列化程序中的电子邮件,如下所示:
from validate_email_address import validate_email
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
def validate_email(self, value):
if not validate_email(value):
raise serializers.ValidationError("Not a valid email.")
return value
class Meta:
model = User
fields = ('email', 'password')
此外,您可以考虑使用Djoser等打包的身份验证/注册解决方案。