English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Se il tuo sito consente agli utenti di inserire contenuti tramite la pagina web e inserire questi contenuti nel database SQLite, in questo caso ti trovi di fronte a un problema di sicurezza chiamato iniezione SQL. Questa sezione ti spiegherà come prevenire questo tipo di situazione, garantendo la sicurezza degli script e delle query SQLite.
L'iniezione di codice si verifica solitamente quando si richiede l'input dell'utente, come quando si richiede all'utente di inserire il nome, ma l'utente inserisce una query SQLite, che viene eseguita inconsciamente nel database.
Non credere mai ai dati forniti dagli utenti, quindi elaborare solo i dati validati, questa regola è completata tramite abbinamento di modelli. Nei seguenti esempi, il nome utente username è limitato ai caratteri alfanumerici o di sottolineatura, la lunghezza deve essere tra 8 e 20 caratteri - modificare queste regole secondo necessità.
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)){}} $db = new SQLiteDatabase('filename'); $result = @$db->query("SELECT * FROM users WHERE username = $matches[0]");} else { echo "username not accepted";}
Per illustrare il problema, vediamo l'estratto seguente-
$name = "Qadir'; DELETE FROM users;";@$db->query("SELECT * FROM users WHERE username = '{$name}'");
La chiamata alla funzione è per recuperare le record della colonna name nella tabella utenti che corrispondono al nome specificato dall'utente. Normalmente,$name che contiene solo caratteri alfanumerici o spazi, come la stringa ilia. Ma in questo caso, è stato aggiunto un nuovo query a $name, questa chiamata al database causerà problemi disastrosi: la query DELETE injectata eliminerà tutti i record di users.
Nonostante esistano interfacce di database che non permettono la sovrapposizione di query o l'esecuzione di più query in una singola chiamata di funzione, se si tenta di sovrapporre query, la chiamata fallirà, ma SQLite e PostgreSQL eseguono comunque query sovrapposte, ovvero eseguono tutte le query fornite in una stringa, il che può causare problemi di sicurezza gravi.
In linguaggi di script come PERL e PHP, è possibile gestire in modo elegante tutti i caratteri di escape. Il linguaggio di programmazione PHP fornisce la funzione di stringa SQLite3::escapeString($string) e sqlite_escape_string() per escapare i caratteri di input speciali per SQLite.
Attenzione: utilizzare la funzione sqlite_escape_string() richiede la versione PHP PHP 5 < 5.4.0.
Più alta versione PHP 5 >= 5.3.0, PHP 7 utilizza le seguenti funzioni:
if (get_magic_quotes_gpc()) { $name = sqlite_escape_string($name); } $result = @$db->query("SELECT * FROM users WHERE username = '{$name}'");
尽管编码使得插入数据变得安全,但是它会呈现简单的文本比较,在查询中,对于包含二进制数据的列,LIKE 子句不可用。
请注意,addslashes() 不应该被用在 SQLite 查询中引用字符串,它会在检索数据时导致奇怪的结果。