Commit b979144c by Patryk Czarnik

Parametry i SQLInjection

parent 3b5c93be
package bazy.a_poczatek; package bazy.a_poczatek;
import org.apache.commons.lang3.StringUtils;
import javax.swing.*; import javax.swing.*;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.sql.*; import java.sql.*;
public class OdczytajNiektoreRekordy1 { public class OdczytajNiektoreRekordy1 {
// wersja 1 - mało wydajna, bo program ściąga dane całej tabeli i dopiero potem sprawdza if-em
// tak napisany program nie skorzysta w żaden sposób z indeksów zdefiniowanych w bazie danych (nawet, gdyby były)
public static void main(String[] args) { public static void main(String[] args) {
try (Connection c = DriverManager.getConnection( try (Connection c = DriverManager.getConnection(
...@@ -13,18 +17,19 @@ public class OdczytajNiektoreRekordy1 { ...@@ -13,18 +17,19 @@ public class OdczytajNiektoreRekordy1 {
"vps497901_abc123")) { "vps497901_abc123")) {
String szukanyJob = JOptionPane.showInputDialog("Podaj kod stanowiska", "IT_PROG"); String szukanyJob = JOptionPane.showInputDialog("Podaj kod stanowiska", "IT_PROG");
// TODO wypisz tylko pracowników, którzy mają podane job_id // Wypisz tylko pracowników, którzy mają takie job_id
try(PreparedStatement stmt = c.prepareStatement("SELECT * FROM employees")) { try(PreparedStatement stmt = c.prepareStatement("SELECT * FROM employees")) {
try (ResultSet rs = stmt.executeQuery()) { try(ResultSet rs = stmt.executeQuery()) {
while (rs.next()) { while (rs.next()) {
int id = rs.getInt(1); int id = rs.getInt(1);
String firstName = rs.getString(2); String firstName = rs.getString(2);
String lastName = rs.getString(3); String lastName = rs.getString(3);
String job = rs.getString("job_id"); String job = rs.getString("job_id");
BigDecimal salary = rs.getBigDecimal("salary"); BigDecimal salary = rs.getBigDecimal("salary");
if(StringUtils.equalsIgnoreCase(job, szukanyJob)) {
System.out.printf("%d: %s %s (%s) zarabia %s\n", id, firstName, lastName, job, salary); System.out.printf("%d: %s %s (%s) zarabia %s\n", id, firstName, lastName, job, salary);
}
} }
} }
} }
......
package bazy.a_poczatek;
import org.apache.commons.lang3.StringUtils;
import javax.swing.*;
import java.math.BigDecimal;
import java.sql.*;
public class OdczytajNiektoreRekordy2 {
// Wersja niebezpieczna, narażona na atak SQL-injection. Wpisując spreparowane teksty do okna wyszukiwania,
// można zmienić dane lub zepsuć bazę danych:
// ';update employees set salary = 33000 where employee_id=170; select '
// ';update employees set salary = 1; select '
// ';drop table employees cascade; select '
// xx' OR salary > 15000 OR 'ala' = 'ola
public static void main(String[] args) {
try (Connection c = DriverManager.getConnection(
"jdbc:postgresql://vps497901.ovh.net:5432/hr",
"kurs",
"vps497901_abc123")) {
String szukanyJob = JOptionPane.showInputDialog("Podaj kod stanowiska", "IT_PROG");
// Wypisz tylko pracowników, którzy mają takie job_id
try(PreparedStatement stmt = c.prepareStatement("SELECT * FROM employees WHERE job_id = '" + szukanyJob + "'")) {
System.out.println("Zaraz wykonam: " + stmt);
try(ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
int id = rs.getInt(1);
String firstName = rs.getString(2);
String lastName = rs.getString(3);
String job = rs.getString("job_id");
BigDecimal salary = rs.getBigDecimal("salary");
System.out.printf("%d: %s %s (%s) zarabia %s\n", id, firstName, lastName, job, salary);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package bazy.a_poczatek;
import javax.swing.*;
import java.math.BigDecimal;
import java.sql.*;
public class OdczytajNiektoreRekordy3 {
// Wersja poprawna: wydajna i bezpieczna. Używa parametrów pozycyjnych JDBC.
public static void main(String[] args) {
try (Connection c = DriverManager.getConnection(
"jdbc:postgresql://vps497901.ovh.net:5432/hr",
"kurs",
"vps497901_abc123")) {
String szukanyJob = JOptionPane.showInputDialog("Podaj kod stanowiska", "IT_PROG");
// Wypisz tylko pracowników, którzy mają takie job_id
try(PreparedStatement stmt = c.prepareStatement("SELECT * FROM employees WHERE job_id = ?")) {
stmt.setString(1, szukanyJob);
System.out.println("Zaraz wykonam: " + stmt);
try(ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
int id = rs.getInt(1);
String firstName = rs.getString(2);
String lastName = rs.getString(3);
String job = rs.getString("job_id");
BigDecimal salary = rs.getBigDecimal("salary");
System.out.printf("%d: %s %s (%s) zarabia %s\n", id, firstName, lastName, job, salary);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package bazy.a_poczatek;
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 java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
public class OdczytajNiektoreRekordy4 {
public static void main(String[] args) {
final String url = "jdbc:postgresql://vps497901.ovh.net:5432/hr";
try(Connection c = DriverManager.getConnection(url, "kurs", "vps497901_abc123")) {
List<String> jobs = znajdzJoby(c);
String szukany_job = (String) JOptionPane.showInputDialog(null,
"Wybierz job", "Pytanie", JOptionPane.QUESTION_MESSAGE, null, jobs.toArray(), null);
wypiszJob(c, szukany_job);
} catch (SQLException e) {
e.printStackTrace();
}
}
private static List<String> znajdzJoby(Connection c) throws SQLException {
List<String> jobs = new ArrayList<>();
try(PreparedStatement stmt = c.prepareStatement("SELECT DISTINCT job_id FROM employees ORDER BY 1");
ResultSet rs = stmt.executeQuery()) {
while(rs.next()) {
jobs.add(rs.getString(1));
}
}
return jobs;
}
private static void wypiszJob(Connection c, String szukany_job) throws SQLException {
try(PreparedStatement stmt = c.prepareStatement("SELECT * FROM employees WHERE job_id = ?")) {
// wstawienie wartości do parametru nr 1 (który znak zapytania licząc od lewej), numeracja od 1
stmt.setString(1, szukany_job);
System.out.println("Zapytanie do wykonania: " + stmt);
try(ResultSet rs = stmt.executeQuery()) {
while(rs.next()) {
int id = rs.getInt("employee_id");
String imie = rs.getString("first_name");
String nazwisko = rs.getString("last_name");
String job = rs.getString("job_id");
BigDecimal salary = rs.getBigDecimal("salary");
System.out.printf("Pracownik nr %d: %s %s (%s) zarabia %s\n",
id, imie, nazwisko, job, salary);
}
}
}
}
}
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