2012-12-02 8 views
5

Po prostu bawiłem się pomysłem i nie mogłem wymyślić sposobu na rozwiązanie tego problemu w backendach bez zniechęcenia do problemów z bezpieczeństwem.Ocena algorytmów od "niezaufanych" użytkowników

Załóżmy, że chcę dać użytkownikom możliwość tworzenia prostych algorytmów za pośrednictwem usługi internetowej i testowania ich na małych listach, np. range(0, 5) następnie zgłosić wyniki z powrotem za pośrednictwem innego serwisu internetowego, szablonu lub wiadomości e-mail, tak naprawdę nie ma znaczenia, jest to ocena, która mi przeszkadza.

Korzystanie python:

class Algorithm(whatever): 
    function = whatever.CharField(max_length=75) 

Użytkownik może wprowadzić coś takiego:

'f(x)=x+(x/5)**0.75' 

Oczywiście mógłbym wykorzystać eval, pozbawiając wszelkich Zabudowy, sznurki inne niż "x" itd., ale to prawdopodobnie byłaby niefortunna praktyka.

Jedyne, co mogę wymyślić, to przenieść dowolną funkcję oceny do interfejsu JavaScript.

+1

Cóż, Google z pewnością robi tego rodzaju rzeczy w swoich kodeksach. Zastanawiam się, jak rozwiązują ten problem. Być może uruchom niezaufany kod maszyny wirtualnej z wymaganą konfiguracją. Więc nawet jeśli zablokują maszynę wirtualną, nadal jesteś bezpieczny – inspectorG4dget

+0

, jeśli usuniesz ewentualne słowo kluczowe "importuj", nic nie powinno się stać z punktu widzenia uszkodzenia danych. –

+0

@MaxLi Co z '__import__'? – Natan

Odpowiedz

3

eval() jest złe, a robienie tego na zapleczu jest bardzo niebezpieczne. Jednak można to zrobić bezpiecznie za pomocą python sandbox. Ale jeśli piaskownica zawodzi, zostaniesz właścicielem. To nie jest bardzo "podejście do głębi".

Lepszym rozwiązaniem byłoby oszacowanie obciążenia po stronie klienta ... Jednak jest to Cross-Site Scripting (XSS). Jednym ze sposobów uniemożliwienia napastnikowi wykorzystania tego problemu jest obsługa zdarzeń po stronie klienta, która ocenia formularz po naciśnięciu przycisku. Jeśli atakujący może zbudować żądanie GET lub POST, które wykonuje JavaScript, może wykorzystać lukę XSS. Upewnij się także, aby ustawić x-frame-options: deny, aby zapobiec clickjacking.