Hi, 

dir_name in the exception is '/home/joalbert/Documents/Remesas 
App/RemesasServer/media/payments/images/filename.jpg'

The setting for media is:
Settings.py:
MEDIA_ROOT = "./media/"#os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

I try also with 
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
where BASE_DIR = Path(__file__).resolve().parent.parent

If you could tell me how could fix it, it would be nice. Since I do not 
have idea how to remove this exception.

Sincerely,
Joalbert
On Friday, February 4, 2022 at 12:33:51 AM UTC-5 [email protected] wrote:

> This is obviously some type of security feature to prevent someone from 
> climbing up a directory. You have ".." in your string for the file path 
> somewhere. 
>
> What is the value of "dir_name" when the exception is raised? It should be 
> in the traceback somewhere. Should help narrow down where it's coming from. 
> Most likely a mistake you made in your settings file concating strings 
> related to where Django should upload files. 
>
> On Thu, Feb 3, 2022, 2:12 PM Joalbert Palacios <[email protected]> wrote:
>
>> Hi group,
>>
>> I have been updating my django version so as to cover the last security 
>> patch with django version 3.2  (current version 3.2.12). 
>>
>> Unfortunately, after this update the following exception occurs during 
>> execution of testing:
>>
>> Detected path traversal attempt in '/home/joalbert/Documents/Remesas 
>> App/RemesasServer/media/payments/images/temp_qHaTViL.png'
>> Bad Request: /webapp/payment
>>
>> I have read 
>> https://stackoverflow.com/questions/69745412/django-and-suspiciousfileoperationdetected-path-traversal-attempt
>>  
>> and followed but not works in my case, maybe I misunderstood something, I 
>> would appreciate any help regarding how to fix those exception. 
>>
>> I read django code and find the errors is in the following section:
>>
>> def get_available_name(self, name, max_length=None):
>>
>> """
>>
>> Return a filename that's free on the target storage system and
>>
>> available for new content to be written to.
>>
>> """
>>
>> name = str(name).replace('\\', '/')
>>
>> dir_name, file_name = os.path.split(name)
>>
>> if '..' in pathlib.PurePath(dir_name).parts:
>>
>> raise SuspiciousFileOperation("Detected path traversal attempt in '%s'" % 
>> dir_name)
>>
>> Here it is my code in the sections that code goes by to send response to 
>> client.
>>
>> *Model.py:*
>> class Payment(models.Model):
>> STATUS = ((0, _("Draft")), (1, _("Aproved")), (2 , _("Rejected")), (3, 
>> _("Released")))
>> order_number_id = models.OneToOneField(Exchange_Order, 
>> on_delete=models.CASCADE, related_name="order_payment")
>> user_id =models.ForeignKey(User, verbose_name=_('user'), on_delete= 
>> models.CASCADE, related_name="payment_user_id")
>> capture = models.FileField(verbose_name=_('image'), 
>> upload_to="payments/images", max_length=1024)
>> payment_date = models.DateTimeField(verbose_name=_('date'), 
>> default=datetime.now().replace(tzinfo=timezone.utc))
>> status = models.PositiveSmallIntegerField(verbose_name=_('status'), 
>> default=0, choices=STATUS) 
>> reason = models.ForeignKey(Reasons,verbose_name=_('reason'), 
>> on_delete=models.CASCADE, related_name="payment_reason", 
>> null=True, blank=True)
>>
>> def __str__(self) -> str:
>> return f"{self.order_number_id} {self.user_id.username} 
>> {self.payment_date}"
>> class Meta: #new
>> verbose_name = _("Payment from Client to 'Activo Digital'")
>> verbose_name_plural = _("Payments from Client to 'Activo Digital'")
>>
>> *forms.py*
>> class Payment_All_Form(forms.ModelForm):
>> class Meta: 
>> model = Payment
>> fields = "__all__"
>> views.py (only post method is included for clarity)
>> class PaymentSessionView(LoginRequiredMixin, CreateView):
>> queryset = Payment.objects.all()
>> form_class = Payment_Form
>> http_method_names = ['get', 'post']
>> template_name="clienteServidor/webapp/payment.html" 
>>
>> @method_decorator(User_Detail_Permission_Web)
>> def post(self, request, *args, **kwargs):
>> models = Exchange_Order.objects.filter(status=0, user_id=request.user)
>> # En caso de que no haya ordenes abiertas
>> if not models.exists():
>> context =self._add_context_data()
>> context["existant"] ="No hay orden abierta"
>> context["form"] = Payment_Form()
>> return render(request,self.template_name, context)
>> # Procesar pago para ordenes abiertas
>> forms = []
>> data_list = []
>> order_ids = []
>> for model in models:
>> my_data = self._complete_data(request, model.id)
>> data_list.append(my_data)
>> order_ids.append(f"Orden: {model.id}")
>> forms.append(Payment_All_Form(my_data,request.FILES))
>> # Chequear que todas las formas sean validas
>> are_valids = []
>> for form in forms: 
>> are_valids.append(form.is_valid())
>> # If any invalid
>> if False in are_valids:
>> for index, items in enumerate(are_valids):
>> if not items:
>> form = forms[index] 
>> context = self._add_context_data() 
>> context["form"] = form 
>> return render(request,self.template_name, context)
>> for index, model in enumerate(models):
>> if index == 0:
>> forms[index].save()
>> else:
>> data_list[index]["order_number_id"]=model
>> data_list[index]["user_id"]=request.user
>> datum = {k:v for k,v in data_list[index].items() if 
>> k!="csrfmiddlewaretoken"}
>> payment = Payment(**datum)
>> payment.save() 
>> model.status=1
>> model.grouped_orders = order_ids
>> model.save()
>> my_message ="Orden Nro "+ str(model.id) + (" fue procesada exitosamente, 
>> les estaremos notificando"
>> " por correo cuando el pago sea validado y procesado en el destino.")
>> messages.add_message(request, messages.INFO, my_message)
>> return HttpResponseRedirect(reverse_lazy("transaction_web"))
>>
>> Settings.py:
>> MEDIA_ROOT = "./media/"#os.path.join(BASE_DIR, 'media')
>> MEDIA_URL = '/media/'
>>
>> I hope sincerely that you could have any answer how to fix it. I really 
>> appreciate your help regarding this issue.
>>
>> Sincerely,
>> Joalbert 
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Django users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/django-users/35a15616-92fc-41d4-97b3-8fb3061ec881n%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/django-users/35a15616-92fc-41d4-97b3-8fb3061ec881n%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/9de4405b-bff1-4b5f-a9ce-ec449d367d0en%40googlegroups.com.

Reply via email to