SQL, min kod är sårbara för SQL Injections.

Permalänk
Medlem

SQL, min kod är sårbara för SQL Injections.

Hejhej.

Sitter och pillar lite med PHP och MSSQL. Håller på att fixa en adminlogin till sidan, men den fungerar inte som den ska och det är möjligt att använda sig av SQL Injections. Det skumma är att jag har kopierat koden från min "användarlogin" som fungerar som den ska och såvitt jag vet är den inte sårbar för SQL injections (Mycket möjligt att den ändå är det dock).

Här är koden för min SÅRBARA adminlogin:

<?php session_start(); $dbhost = "*********"; $dblogin = "********"; $dbpass = "********"; $db_name = "members"; $connect = mssql_connect("$dbhost", "$dblogin", "$dbpass")or exit("cannot connect"); $select = mssql_select_db("$db_name")or exit("cannot select DB"); $username = $_POST['login']; $password = $_POST['password']; $md5_pass = md5($password); $db_check = "SELECT id FROM [members].[dbo].[admin] WHERE login='$username'AND passw='$md5_pass'"; $db_query = mssql_query($db_check); $nums = mssql_num_rows($db_query); if($nums == 1){ session_register("username"); $_SESSION['username'] = $username; header("Location: nwindex.php?page=signedin"); } else{ $close = mssql_close(); $ip = getenv('REMOTE_ADDR'); $browser = getenv('HTTP_USER_AGENT'); $date = date('l dS \of F Y H:i:s '); $newconnect = mssql_connect("$dbhost", "$dblogin", "$dbpass")or exit("cannot connect"); $newselect = mssql_select_db("$db_name")or exit("cannot select DB"); $db_store_login_fails = "INSERT INTO [members].[dbo].[loginfail]([IP],[BROWSER],[USER_ATTEMPT],[FORM],[DATE])VALUES('$ip','$browser','$username','Admin Login','$date')"; $db_store_qry = mssql_query($db_store_login_fails); echo "<font color='red' face='verdana' size=2><br><br>Unauthorized!</font><br><br>"; } ?>

Här är koden för ANVÄNDARLOGIN, (Som ICKE (?) är sårbar):

<?php session_start(); $dbhost = "*******"; $dblogin = "*********"; $dbpass = "************"; $db_name = "members"; $connect = mssql_connect("$dbhost", "$dblogin", "$dbpass")or exit("cannot connect"); $select = mssql_select_db("$db_name")or exit("cannot select DB"); $username = $_POST['username']; $password = $_POST['pass']; $md5_pass = md5($password); $db_check = "SELECT usr FROM [members].[dbo].[user] WHERE usr='$username'AND password='$md5_pass'"; $db_query = mssql_query($db_check); $nums = mssql_num_rows($db_query); if($nums == 1){ session_register("username"); $_SESSION['username'] = $username; header("Location: nwindex.php?page=signedin"); } else{ $close = mssql_close(); $ip = getenv('REMOTE_ADDR'); $browser = getenv('HTTP_USER_AGENT'); $date = date('l dS \of F Y H:i:s '); $newconnect = mssql_connect("$dbhost", "$dblogin", "$dbpass")or exit("cannot connect"); $newselect = mssql_select_db("$db_name")or exit("cannot select DB"); $db_store_login_fails = "INSERT INTO [members].[dbo].[loginfail]([IP],[BROWSER],[USER_ATTEMPT],[FORM],[DATE])VALUES('$ip','$browser','$username','User Login','$date')"; $db_store_qry = mssql_query($db_store_login_fails); echo "<font color='red' face='verdana' size=2><br><br>Unauthorized!</font><br><br>"; } ?>

Det går att injecta vad som helst i stort sett, t.ex ' or 1=1--
eller någon lite "ondare" som t.ex: ' or ID='1' INSERT INTO [members].[dbo].[user]([usr],[password],[fullname],[mail])VALUES('I', 'CAN ', 'INJECT', 'SQL')--

Så, varför är min "adminlogin" sårbar men inte min "userlogin"?

Tack på förhand /Crazzir

Visa signatur

Asus P8P67 Pro | Core i7 2600 | Sapphire Radeon R9 290 | A-DATA SSD 510

Permalänk
Medlem

Nu programmerar jag inte php men borde det inte räcka med att slänga in

$username = mysql_escape_string($_POST['username']); $password = mysql_escape_string($_POST['pass']);

för att skydda mot SQL injections?

Visa signatur
Permalänk
Medlem

Jo det ska jag prova. Men jag förstår fortfarande inte varför jag kan göra SQL Injections på den ena sidan men inte på den andra, för koden är ju i stort sett samma. Endast variabler som har nytt namn, samt tabellnamnen som är annorlunda.

Edit: Finns ju inte någon mssql_escape_string, eller kallas den något annat för MSSQL?

Ps. Kan ju tillägga att jag inte är nåt vidare duktig på varesig PHP eller SQL. Men det är nog rätt uppenbart. Håller på att lära mig.

Visa signatur

Asus P8P67 Pro | Core i7 2600 | Sapphire Radeon R9 290 | A-DATA SSD 510

Permalänk
Medlem

Prepared statements är utomordentligt bra om man vill vara skyddad mot injections. Dock får du byta ut mysql_*-funktionerna mot PDO-funktionalitet, men PDO har en massa annat nyttigt också.

http://www.php.net/pdo

Permalänk
Medlem

Tack så mycket bjornie! Skall läsa på om det.

Visa signatur

Asus P8P67 Pro | Core i7 2600 | Sapphire Radeon R9 290 | A-DATA SSD 510

Permalänk
Medlem

Använd inte mysql_escape_string, använd mysql_real_escape_string. Den senare tar hänsyn till charset. Eller kör på prepared statements som sagt.

Visa signatur

Mina boktips: Clean codeHead First Design PatternsHead First Object-oriented Analysis and Design
Innovation distinguishes between a leader and a follower. — Steve Jobs

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av DrRotmos
Använd inte mysql_escape_string, använd mysql_real_escape_string. Den senare tar hänsyn till charset. Eller kör på prepared statements som sagt.

Jag har löst det nu, men vad jag kan se iaf på php.net så finns det inte någon liknande fast för mssql. Tack så mycket för hjälpen iaf.

Visa signatur

Asus P8P67 Pro | Core i7 2600 | Sapphire Radeon R9 290 | A-DATA SSD 510

Permalänk
Medlem

Oj sorry såg inte att det var mssql du körde jag bara antog så dära fördomsfullt att php:are alltid kör med mysql

Visa signatur
Permalänk
Avstängd

Går det inte i PHP att köra med parametrar? Typ

WHERE fältnamn=?fältnamn

Visa signatur
Permalänk
Medlem

Prepared statements kallas det för, och har redan nämnts

Visa signatur

Mina boktips: Clean codeHead First Design PatternsHead First Object-oriented Analysis and Design
Innovation distinguishes between a leader and a follower. — Steve Jobs