Commit 5799ced5 authored by Antonios Angelakis's avatar Antonios Angelakis

Finish chapter 6

parent 5d96d96a
......@@ -2,6 +2,7 @@
\setlength\parindent{0pt}
\usepackage{listings}
%%%
%%% The document
%%%
......@@ -218,14 +219,15 @@ languages, Certified code.
\bigskip
Επιπλέον, κρίθηκε σημαντικό να προστεθεί η Python στις διαθέσιμες γλώσσες υποβολής
καθώς πρόκειται για μια από τις πλέον δημοφιλείς γλώσσες και χρησιμοποιείται ως
εισαγωγική γλώσσα προγραμματισμού σε σημαντικά ακαδημαϊκά ιδρύματα, όπως είναι το
MIT και το Stanford (TODO citation needed). Τέλος, ήταν απαραίτητο να γίνουν μικρές
βελτιστοποιήσεις στη λογική του grader, να προστεθούν μικρότερες δυνατότητες που
επιδιώκουν τη βελτίωση της ευκολίας χρήσης για διαγωνιζόμενους και διαχειριστές και
να αντικατασταθούν απαρχαιωμένα (TODO obsolete, pws na to pw) εργαλεία/βιβλιοθήκες
για την επίτευξη καλύτερης απόδοσης και ασφάλειας.
Επιπλέον, κρίθηκε σημαντικό να προστεθεί η Python στις διαθέσιμες γλώσσες
υποβολής καθώς πρόκειται για μια από τις πλέον δημοφιλείς γλώσσες και
χρησιμοποιείται ως εισαγωγική γλώσσα προγραμματισμού σε σημαντικά ακαδημαϊκά
ιδρύματα, όπως είναι το MIT και το Stanford (TODO citation needed). Τέλος, ήταν
απαραίτητο να γίνουν μικρές βελτιστοποιήσεις στη λογική του grader, να
προστεθούν μικρότερες δυνατότητες που επιδιώκουν τη βελτίωση της ευκολίας
χρήσης για διαγωνιζόμενους και διαχειριστές και να αντικατασταθούν απαρχαιωμένα
(TODO obsolete, pws na to pw) εργαλεία/βιβλιοθήκες για την επίτευξη καλύτερης
απόδοσης και ασφάλειας.
\bigskip
......@@ -253,7 +255,7 @@ MIT και το Stanford (TODO citation needed). Τέλος, ήταν απαρα
λειτουργίας του grader στο πλαίσιο προγραμματιστικών ασκήσεων.
\item Κεφάλαιο 6: Λοιπές Προσθήκες \\
Στο συγκεκριμένο κεφάλαιο παρατίθενται βελτιώσεις και προσθήκες μικρότερου
μεγέθους, όπως είναι η προσθήκη της Python και η αλλαγή της βιβλιοθήκης
μεγέθους, όπως είναι η προσθήκη της Python και η αλλαγή της επέκτασης
MySQL σε PDO.
TODO: change this
\item Κεφάλαιο 7: Συμπεράσματα \\
......@@ -1170,10 +1172,11 @@ descriptor.json στο οποίο έχουν συμπληρωθεί όλα τα
\subsection{Εργαλείο δημιουργίας}
Χάρη στην αναγνώσιμη μορφή του JSON είναι εύκολο ένας διαχειριστής να συντάξει
ένα JSON αρχείο για το ανέβασμα αρχείων ελέγχου και καθορισμό ομάδων. Παρόλα αυτά,
θα είναι αρκετά χρήσιμο το συγκεκριμένο αρχείο να μη συντάσσεται με το χέρι, ώστε
να μην υπάρχει και η πιθανότητα σφάλματος. Για το λόγο αυτό δημιουργήθηκε ένα
interactive script σε Python για την αυτόματη παραγωγή ενός descriptor.json αρχείου.
ένα JSON αρχείο για το ανέβασμα αρχείων ελέγχου και καθορισμό ομάδων. Παρόλα
αυτά, θα είναι αρκετά χρήσιμο το συγκεκριμένο αρχείο να μη συντάσσεται με το
χέρι, ώστε να μην υπάρχει και η πιθανότητα σφάλματος. Για το λόγο αυτό
δημιουργήθηκε ένα interactive script σε Python για την αυτόματη παραγωγή ενός
descriptor.json αρχείου.
\bigskip
......@@ -1186,15 +1189,134 @@ interactive script σε Python για την αυτόματη παραγωγή
(TODO: εικονα ιντερακτιβ)
\section{Αλλαγή mysql connector}
\section{Αλλαγή MySQL connector}
- Κατασταση τώρα
Μια τροποποίηση που θεωρήθηκε απαραίτητη ήταν η αλλαγή της επέκτασης
επικοινωνίας της PHP με τη MySQL βάση δεδομένων μας. Η επέκταση, που
χρησιμοποιείται τόσο από τον Grader όσο και από τον Kewii, είναι το πρωτότυπο
(original) MySQL API. Το συγκεκριμένο API έχει αρκετά μειονεκτήματα, που έχουν
οδηγήσει και στην παύση της υποστήριξης του όπως περιγράφεται στο (TODO:
https://wiki.php.net/rfc/mysql\_deprecation).
\subsection{ connector pdo}
\bigskip
Δεδομένου ότι η συγκεκριμένη επέκταση δεν συντηρείται πλέον και ακόμα χειρότερα
εμφανίζει E\_DEPRECATED σφάλματα ήδη από την έκδοση 5.5 της PHP (στην 7 δεν
υπάρχει), είναι επιτακτικό να αφαιρεθεί από τον κώδικα της εφαρμογής μας και να
αντικατασταθεί με μια πιο σύγχρονη. Οι επίσημα υποστηριζόμενες επεκτάσεις που
μπορούμε να χρησιμοποιήσουμε είναι οι mysqli και PDO
(https://secure.php.net/manual/en/mysql.php). Για την επιλογή χρησιμοποιήθηκε ο
παρακάτω πίνακας σύγκρισης των προαναφερθέντων επεκτάσεων που υπάρχει στο
manual της PHP (https://secure.php.net/manual/en/mysql.php TODO).
(TODO: pinakas connectors)
\bigskip
Όπως βλέπουμε, τόσο το mysqli όσο και το PDO υποστηρίζονται και προτείνονται
για νέες υλοποιήσεις. Κάτι που δεν γίνεται εμφανές στο συγκεκριμένο πίνακα
είναι το γεγονός ότι το PDO αποτελεί μια γενικευμένη διεπαφή ή οποία διαθέτει
οδηγούς για πολλές διαφορετικές βάσεις δεδομένων εκτός από την SQL,
προσφέροντας στο χρήστη ένα API υψηλού επιπέδου και επιτρέποντας του να αλλάξει
πολύ εύκολα βάση δεδομένων, αν χρειαστεί. Και οι δύο επεκτάσεις έχουν αρκετές
δυνατότητες που μας ενδιαφέρει να υλοποιηθούν με σημαντικότερη αυτή των
prepared statements.
\bigskip
Τα prepared statements επιτρέπουν την εκτέλεση συγκεκριμένων επερωτημάτων
(queries) με αντικατάσταση των παραμέτρων που αλλάζουν κάθε φορά. Αυτό έχει δύο
σημαντικά πλεονεκτήματα. (http://php.net/manual/en/pdo.prepared-statements.php
TODO) Αρχικά, αυξάνει ιδιαίτερα την απόδοση στην εκτέλεση διαδοχικών queries
βασισμένων στο ίδιο prepared statement. Επιπλέον, αυξάνει πολύ την ασφάλεια της
εφαρμογής μας, καθώς αποκλείει ουσιαστικά την πιθανότητα επίθεσης έκχυσης
(injection) κώδικα SQL.
\bigskip
Η επίθεση με SQL injection γίνεται δυνατή λόγω του τρόπου που δημιουργείται το
κάθε query. Αν δεν ελεγχθεί σωστά η είσοδος του χρήστη, υπάρχει η περίπτωση ο
τελευταίος να εκμεταλλευτεί ειδικούς χαρακτήρες της SQL, π.χ. τον χαρακτήρα που
ξεκινάει ένα σχόλιο, και να αλλοιώσει το Query, επηρεάζοντας την εκτέλεση και
επιτυγχάνοντας, ιδανικά, την πρόσβαση σε ευαίσθητα δεδομένα ή σελίδες.
\bigskip
Ο τρόπος που επιτυγχάνεται η αντοχή στις προαναφερθείσες επιθέσεις βασίζεται
τρόπος λειτουργίας των prepared statements. Σε πρώτη φάση, δημιουργείται το
πρότυπο επερώτημα δίχως τις παραμέτρους και μεταγλωττίζεται ξεχωριστά. Οι
παράμετροι, στέλνονται ξεχωριστά με διαφορετικό πρότυπο επικοινωνίας με
αποτέλεσμα να μην είναι δυνατόν να εισαχθούν ειδικοί χαρακτήρες που θα
επηρεάσουν την εκτέλεση του query.
\bigskip
Για την υλοποίηση επιλέχθηκε, τελικά, το PDO για τους λόγους επεκτασιμότητας
που αναφέρθηκαν παραπάνω δεδομένου ότι στα υπόλοιπα κριτήρια δεν υστερεί σε
σχέση με το mysqli, και η υπάρχουσα σχεδίαση μας είναι αντικειμενοστρεφής ούτως
ή άλλως, που υποστηρίζεται από το PDO (που δεν υποστηρίζει δομημένο στυλ).
\subsection{Συνοπτική περιγραφή επέκτασης PDO}
Η επέκταση PDO (PHP Data Objects), αποτελεί μια μικρού μεγέθους, συνεπή (για
τις διαφορετικές βάσεις δεδομένων) διεπαφή για την πρόσβαση και χρήση βάσεων
δεδομένων σε PHP. Μέσω των διάφορων, χαμηλού επιπέδου, οδηγών της επιτρέπει την
ενοποίηση του πλήθους των μεθόδων κάθε βάσης σε μια κοινή, πλούσια διεπαφή που
περιστρέφεται γύρω από κοινά αντικείμενα που αντιστοιχούν σε κάθε πίνακα ξεχωριστά.
(http://php.net/manual/en/intro.pdo.php).
\bigskip
Η σχεδίαση της συγκεκριμένης επέκτασης έχει γίνει με έμφαση στην ευκολία χρήσης
και την επαναχρησιμοποίηση του ίδιου κώδικα για διαφορετικές βάσεις δεδομένων
και συναφείς λειτουργίες. Η σύνδεση στην εκάστοτε βάση δεδομένων γίνεται με τη
χρήση μιας σειριακής δομής δεδομένων, με όνομα Data Source Name
(https://en.wikipedia.org/wiki/Data\_source\_name), έπειτα από την οποία,
δημιουργείται ένα αντικείμενο που αντιστοιχεί στη σύνδεση. Τα queries
εκτελούνται με τη χρήση της μεθόδου query, εκτός αν χρησιμοποιηθούν prepared
statements (PDOStatement), όπου χρησιμοποιούνται οι μέθοδοι prepare και
execute. Η επέκταση εμπεριέχει, επίσης, και δική της κλάση εξαιρέσεων
(PDOException). (https://secure.php.net/manual/en/book.pdo.php) Ακολουθούν
παραδείγματα απλών λειτουργιών χρησιμοποιώντας τη συγκεκριμένη επέκταση/API.
\begin{lstlisting}
<?php
$user = "root";
$pass = "root";
$dsn = "mysql:host=localhost;dbname=test";
$charset = "utf8";
$dbh = new PDO('mysql:host=localhost;dbname=test;charset=$charset', $user, $pass);
?>
<?php
$query = "SELECT * FROM foo WHERE bar = " . $db->quote($zip);
$result = $db->query($query);
while($row = $result->fetch(PDO::FETCH_ASSOC)) {
print_r($row);
}
?>
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
- perigrafi tou me xrisi paradeigmatwn
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
- pleonektimata security k tetoia
// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>
\end{lstlisting}
\chapter{Συμπεράσματα}
......
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