Почему SQL-инъекции существуют
Сразу же отмечу, что их не существует, если используется корректно настроенные mysqli или PDO с подготовленными выражениями, так как там всё экранируется автоматически. (В некорректно настроенные, например, с неправильной кодировкой, инъекция может просочиться; подробнее см. Защищают ли подготовленные выражения/переменные полностью от SQL инъекций?)
Чаще всего SQL-инъекции появляются, когда вы собираете строку с SQL-запросом вручную и забываете что-нибудь экранировать. Так вот, когда вы пишете код вроде такого:
$user = $_GET['username'];
$sql = "SELECT email FROM users WHERE username = '$user'";
если в параметре username передать 0' UNION SELECT password FROM users;--, то в итоге получается вот такая строка:
SELECT email FROM users WHERE username = '0' UNION SELECT password FROM users;--'
Эта строка как есть передаётся в mysql-сервер. Он эту строку парсит и выполняет всё, что в ней записано: он не знает происхождения этой строки, он не знает, что вы туда подставили параметр от пользователя. Всё, что ему остаётся, — это покорно выполнить всё, что его попросили, а его попросили выдать все пароли (хорошо, если они будут захэшированные с солью). Поэтому здесь получается инъекция.
Почему код вида if(isset($_GET['blabla'])) безопасен и не содержит инъекции
В случае с php-кодом вместо строки у вас есть готовый php-файл. В этот php-файл не подставляется никаких параметров извне: никаких строк, как в случае с SQL-кодом выше, не собирается.
Ещё перед тем, как загрузить $_GET и $_POST, php-движок парсит php-файл и строит примерно такую последовательность инструкций (описываю условно, в реальном байткоде не ковырялся):
достать из массива $_GET значение по ключу 'blabla'
вызвать функцию isset, передав ей первым аргументом значение из предыдущего шага, и получить возвращённое ей значение
Функция isset просто сравнивает полученное значение с NULL и больше ничего не делает.
Только после того, как php-движок распарсит файл и составит такую инструкцию — только тогда будут загружены пользовательские данные и будет выполнен этот код.
Ни на одном этапе в данной инструкции содержимое $_GET['blabla'] не интерпретируется как php-код, isset тоже не интерпретирует php-код, поэтому независимо от того, что пользователь запихнёт в GET-параметр blabla — этот код всегда будет безопасен.
Когда же возможна php-инъекция?
Когда в php-файле явно прописано интерпретировать значение как php-код. Например, с использованием eval или assert.
В общем, вам нужно знать, интерпретируют ли функции, которые вы вызываете, параметры как какой-то код или нет. Если нет, то, скорее всего, вы в безопасности. Код из переменных никогда не выполнится сам по себе.