Voici un extrait qui supprimera toutes les balises qui ne figurent pas sur la liste blanche, ainsi que tous les attributs de balises qui ne figurent pas sur la liste blanche des attributs (vous ne pouvez donc pas utiliser la fonction onclick
).
Il s'agit d'une version modifiée de http://www.djangosnippets.org/snippets/205/ avec le regex sur les valeurs de l'attribut pour empêcher les gens d'utiliser href="javascript:..."
et d'autres cas décrits à l'adresse http://ha.ckers.org/xss.html .
(par exemple <a href="ja	vascript:alert('hi')">
ou <a href="ja vascript:alert('hi')">
etc.)
Comme vous pouvez le voir, il utilise le (génial) BelleSoupe bibliothèque.
import re
from urlparse import urljoin
from BeautifulSoup import BeautifulSoup, Comment
def sanitizeHtml(value, base_url=None):
rjs = r'[\s]*(&#x.{1,7})?'.join(list('javascript:'))
rvb = r'[\s]*(&#x.{1,7})?'.join(list('vbscript:'))
re_scripts = re.compile('(%s)|(%s)' % (rjs, rvb), re.IGNORECASE)
validTags = 'p i strong b u a h1 h2 h3 pre br img'.split()
validAttrs = 'href src width height'.split()
urlAttrs = 'href src'.split() # Attributes which should have a URL
soup = BeautifulSoup(value)
for comment in soup.findAll(text=lambda text: isinstance(text, Comment)):
# Get rid of comments
comment.extract()
for tag in soup.findAll(True):
if tag.name not in validTags:
tag.hidden = True
attrs = tag.attrs
tag.attrs = []
for attr, val in attrs:
if attr in validAttrs:
val = re_scripts.sub('', val) # Remove scripts (vbs & js)
if attr in urlAttrs:
val = urljoin(base_url, val) # Calculate the absolute url
tag.attrs.append((attr, val))
return soup.renderContents().decode('utf8')
Comme l'ont dit les autres posteurs, pratiquement toutes les bibliothèques de bases de données Python prennent en charge les injections SQL, ce qui devrait vous couvrir.
10 votes
Vous ne devriez pas essayer de résoudre le problème de l'injection SQL en nettoyant les données de l'utilisateur ! Si l'API de la base de données est utilisée correctement, il n'y a aucun risque d'injection SQL.
4 votes
... if database API is used properly there is no chance of SQL injection
. Par correctement, voulez-vous dire utiliser des requêtes paramétrées ? Cela vous couvre-t-il à 100% ?2 votes
@buffer, je sais que votre commentaire est ancien, mais si vous voulez que d'autres personnes que l'OP voient vos commentaires, vous devez les signaler par un symbole \@@.