2012-06-12 14 views
5

Devo consentire ai miei utenti di utilizzare asterischi (*) come caratteri jolly nella ricerca.Sicurezza che consente agli utenti di utilizzare caratteri jolly

È sicuro convertire gli asterischi in% e utilizzare LIKE nella query sql.

So che l'espressione utente-regexp può generare epressioni regolari che richiedono un'eternità per il calcolo. Non credo sia possibile in questo caso, ma ci sono altri problemi di sicurezza con questo?

+0

ci mostri una query di esempio di che cosa proponete? Definirei un limite di tempo per le ricerche degli utenti, al fine di impedire loro di battere troppo forte i server. – Brad

+2

Forse la tua applicazione sarebbe meglio servita integrando un motore di ricerca come Lucene. –

risposta

1

I caratteri jolly nelle espressioni like possono causare modifiche nell'esecuzione della query che fanno sì che RDBMS utilizzi scansioni full-table anziché utilizzare indici. Questo potrebbe rallentare la query quando ci sono molti dati. Consiglierei di verificare l'input dell'utente per la presenza di almeno alcuni caratteri non jolly davanti al primo asterisco.

Si noti inoltre che se si converte *-%, e utilizzare LIKE, avresti bisogno di prendersi cura di _ così, altrimenti sarebbe adattarsi a qualsiasi singolo carattere, non solo la sottolineatura.

0

Se tutti si sta facendo è una semplice sostituzione in questo modo

str_replace('*','%',$query) 

quindi non prevedo alcun sicurezza preoccupazioni, che credo sia quello che si sono preoccupati. Non hai intenzione di aprire alcuna possibilità di SQL Injection o altro (almeno non facendo questa sostituzione, potresti ancora avere problemi di sicurezza se non stai sfuggendo all'input).

Tuttavia, come alcuni altri utenti hanno sottolineato, si apriranno alcuni problemi relativi allo prestazioni . Che cosa succederà se cerco solo *, ho intenzione di riavere il tuo intero tavolo? Il modo migliore (se non si desidera utilizzare un database search engine) sta per fare qualche convalida dell'utente. Molto probabilmente se si desidera impedire una scansione completa della tabella sulla query, si vorrà limitare l'utente a eseguire solo caratteri jolly iniziali o finali.

Buono:

  • *foo
  • bar*

Non buono:

  • *foo*
  • ba*r

Dipenderà davvero da quante righe hai e da quanto ti fidi che i tuoi utenti forniscano effettivamente un input.

0

La vera domanda è, è sicuro lasciare che l'utente decida di parte della query.

Anche in un caso semplice, fornire dati utente al database è non sicuro.

utenti Permettere ingresso da fornire direttamente al database può essere pericoloso, ma per quanto riguarda il filtro e utilizzare il database di fuga strategia (vale a dire: mysql_real_escape_string() (dichiarazioni ben preparati o qualsiasi ORM lo farà per voi) dovrebbe essere abbastanza sicuro.

Tuttavia, può portare a problemi di prestazioni, una semplice EXPLAIN sulla vostra query deve avvertire di quanto righe scansionate da motore RDBMS.

Il modo migliore per attuare tale caratteristica è quella di usa il motore di ricerca (non è quello che stai cercando di fare?)

Ci sono molte scelte fuori là per aiutarvi a implementare questo.

Puoi dare un'occhiata a Sfinge, Solr, Xapian o anche a Lucene. Ci sono tutte scelte eccellenti.

Fondamentalmente consentono di "indicizzare" il contenuto per effettuare ricerche di testo completo aumentando le prestazioni.

possono anche dare alcune funzionalità incredibili come OR, AND, LIKE, MINUS, ecc comparatori/operatori.

Si può quindi essere interessati a questa domanda: Choosing a stand-alone full-text search server: Sphinx or SOLR?

Problemi correlati