sql >> Database teknologi >  >> RDS >> Mysql

SQL Injection Protection

Dette er ikke hvad SQL Injection handler om. Hver gang du bruger parametre, der ikke er blevet renset i din SQL-forespørgsel, lader du din database stå åben for SQL-injektion, som måske ikke nødvendigvis har til formål at ødelægge data. Det kan også være at stjæle data eller få uautoriseret adgang.

Overvej en meget begrænset konto, hvor alt den kunne gøre er SELECT . Du skriver en forespørgsel til godkendelse:

$sql = "SELECT COUNT(*) AS count
          FROM users 
         WHERE user_id='{$_POST['user']}' AND pass='{$_POST['password'}'";

// check if returns a count of 1, if yes, log in

Med normalt input forventer du, at forespørgslen ser sådan ud:

SELECT COUNT(*) AS count
  FROM users 
 WHERE user_id = 'username' AND pass='********'

Hvilket skal returnere 1 som tæller, hvis både brugernavn og pass matcher. Nu forsøger en angriber at logge på som admin. Da du ikke har renset dine input, sender de $_POST['user'] som:admin'; -- . Hele forespørgslen bliver:

SELECT COUNT(*) AS count
  FROM users 
 WHERE user_id = 'admin'; -- AND pass='********'

Alt efter -- er en kommentar, så dette ignorerer den anden betingelse og returnerer 1 uanset. Der er du, du har lige givet en ondsindet bruger admin adgang. Det er sådan nogle rigtige angreb udføres. Du starter med en lavprivilegeret konto, og gennem huller i sikkerheden forsøger du at få adgang til flere privilegier.

Lang historie kort, at have en konto i hele applikationen med begrænsede rettigheder (f.eks.:ingen DROP , ALTER osv.) er god. Giv aldrig nogen eller nogen applikation flere privilegier, end de har brug for. Men for at forhindre SQL-injektion skal du bruge forberedte sætninger .



  1. Erklærer variabel MySQL-trigger

  2. PostgreSQL-fejl:Fatal:rollebrugernavn findes ikke

  3. mysql_fetch_array springer første række over

  4. SQL Replace or Insert Into Syntax fejl