Commit 29574c42 by Patryk Czarnik

OdczytajWybranych - wersja SQL injection i wersja poprawna

parent a474b366
...@@ -29,13 +29,12 @@ public class OdczytajWybranych_v1_If { ...@@ -29,13 +29,12 @@ public class OdczytajWybranych_v1_If {
ResultSet rs = stmt.executeQuery()) { ResultSet rs = stmt.executeQuery()) {
while(rs.next()) { while(rs.next()) {
int id = rs.getInt("employee_id");
String firstName = rs.getString("first_name");
String lastName = rs.getString("last_name");
String jobId = rs.getString("job_id"); String jobId = rs.getString("job_id");
BigDecimal salary = rs.getBigDecimal("salary");
if(Objects.equals(jobId, szukanyJob)) { if(Objects.equals(jobId, szukanyJob)) {
int id = rs.getInt("employee_id");
String firstName = rs.getString("first_name");
String lastName = rs.getString("last_name");
BigDecimal salary = rs.getBigDecimal("salary");
System.out.println("Pracownik nr " + id + ": " + firstName + " " + lastName + " (" + jobId + ") zarabia " + salary); System.out.println("Pracownik nr " + id + ": " + firstName + " " + lastName + " (" + jobId + ") zarabia " + salary);
} }
} }
......
...@@ -6,11 +6,19 @@ import java.sql.DriverManager; ...@@ -6,11 +6,19 @@ import java.sql.DriverManager;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Objects;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
/* */ /* Ta wersja dokonuje filtrowania po stronie bazy danych (WHERE), co jest dobre,
* ale dane wprowadzone przez uzytkownika dokleja bezpośrednio do treści zapytania SQL,
* co daje możliwość wpisania dowolnego kodu SQL, który wykona baza danych.
* To się nazywa "SQL injection", poważny błąd bezpieczeństwa aplikacji.
*
* Przykłady inputów, które prowadziły do problemów:
* - IT_PROG'; UPDATE employees SET salary = 30000 WHERE last_name = 'Austin
* - '; UPDATE employees SET salary = 1; SELECT '
* - '; DROP TABLE employees CASCADE; SELECT '
*/
public class OdczytajWybranych_v2_Where { public class OdczytajWybranych_v2_Where {
...@@ -19,16 +27,19 @@ public class OdczytajWybranych_v2_Where { ...@@ -19,16 +27,19 @@ public class OdczytajWybranych_v2_Where {
// TODO wypisz tych pracowników, którzy mają taki job_id // TODO wypisz tych pracowników, którzy mają taki job_id
try(Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/hr", "kurs", "abc123"); try(Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/hr", "kurs", "abc123");
PreparedStatement stmt = c.prepareStatement("SELECT * FROM employees WHERE job_id = '" + szukanyJob + "'"); PreparedStatement stmt = c.prepareStatement("SELECT * FROM employees WHERE job_id = '" + szukanyJob + "'")) {
ResultSet rs = stmt.executeQuery()) {
System.out.println("Za chwilę wykonam: " + stmt + "\n");
while(rs.next()) {
int id = rs.getInt("employee_id"); try(ResultSet rs = stmt.executeQuery()) {
String firstName = rs.getString("first_name"); while(rs.next()) {
String lastName = rs.getString("last_name"); int id = rs.getInt("employee_id");
String jobId = rs.getString("job_id"); String firstName = rs.getString("first_name");
BigDecimal salary = rs.getBigDecimal("salary"); String lastName = rs.getString("last_name");
System.out.println("Pracownik nr " + id + ": " + firstName + " " + lastName + " (" + jobId + ") zarabia " + salary); String jobId = rs.getString("job_id");
BigDecimal salary = rs.getBigDecimal("salary");
System.out.println("Pracownik nr " + id + ": " + firstName + " " + lastName + " (" + jobId + ") zarabia " + salary);
}
} }
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
......
package zajecia.postgresql;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
/* Ta wersja dokonuje filtrowania po stronie bazy danych (WHERE)
* a parametr do zapytania przekazuje we właściwy sposób, za pomocą ? i setString
* Ta wersja jest poprawna: wydajna i bezpieczna.
*/
public class OdczytajWybranych_v3_Parametry {
public static void main(String[] args) {
String szukanyJob = JOptionPane.showInputDialog("Podaj kod stanowiska, np. IT_PROG");
// TODO wypisz tych pracowników, którzy mają taki job_id
try(Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/hr", "kurs", "abc123");
PreparedStatement stmt = c.prepareStatement("SELECT * FROM employees WHERE job_id = ?")) {
/* W treści zapytania miejsca na parametry oznaczamy znakami ?
* a następnie na obiekcie PreparedStatement ustawiamy wartości parametrów
* za pomocą setString, setInt itd.
* Numer parametru to numer znaku zapytania liczony od 1.
*/
stmt.setString(1, szukanyJob);
System.out.println("Za chwilę wykonam: " + stmt + "\n");
try(ResultSet rs = stmt.executeQuery()) {
while(rs.next()) {
int id = rs.getInt("employee_id");
String firstName = rs.getString("first_name");
String lastName = rs.getString("last_name");
String jobId = rs.getString("job_id");
BigDecimal salary = rs.getBigDecimal("salary");
System.out.println("Pracownik nr " + id + ": " + firstName + " " + lastName + " (" + jobId + ") zarabia " + salary);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment