Осознанно или нет, но даже авторизованные пользователи Вашей системы могут попытаться каким-то образом эксплуатировать уязвимость SQL, поэтому нужно проверять абсолютно все данные, которые пользователь передаёт в систему.
#1 - Пользователь всегда хочет обмануть Вашу систему
Просто помните это и всегда держите в голове.
Прежде всего данные лучше передавать через POST, потому как GET запросы легко отследить в логах web-сервера, потенциально это опасно.
Никогда не используйте прямые пути до исполняемых php-файлов, старайтесь использовать $_SERVER['REQUEST_URI'] в комбинации с белыми списками допустимых URL, в простых проектах данный примитивные роутинг должен быть неплохой заменой полноценному роутингу унифицированных фреймворков.
#2 - Очищайте все данные, которые приходят в скрипт
Вам нужен белый список ключей, которые Вы передаёте через POST, ни в коем случае не создавайте переменные на лету из тех ключей, которые прислал пользователь.
Очищайте все данные, которые имеются внутри разрешённых ключей, например через preg_replace, удаляйте все символы, которые могут повредить системе. Вот пример того как я реализовал метод очистки данных.
На всякий случай, перед тем как писать данные в базу, очищенные данные преобразовывайте при помощи htmlspecialchars(). Мало ли какая уязвимость обнаружится в базе в будущем, нужно быть заранее готовым.
#3 - Передавайте данные в запрос только через хитрые PDO переменные
Из названия правила так же следует и то, что нужно использовать класс PDO вместо mysql или mysqli.
Ниже самая простейшая реализация работы с назначаемыми параметрами (binded parameters):
$username = $_POST['username'];
$statement = $db->prepare('SELECT * FROM `users` WHERE `username` = :username');
$statement->bindParam(":username", $username);
$statement->execute();
Не забывайте, что любую переменную, пришедшую в скрипт нужно очистить.
По коду видно, что мы сначала подготавливаем SQL запрос, потом указываем, что должно быть вместо переменной, после чего выполняем скомпонованный запрос.
Вот пример реализации этой концепции в DrMVC.
Ссылки битые
Благодарю Дмитрий, ссылки поправил.