Всегда плохая идея помещать данные из запроса get непосредственно в SQL, и существует множество простых способов предотвратить внедрение SQL.
Для простого случая, когда вы знаете, что вам нужен числовой идентификатор, вы можете просто заставить значение быть числовым, и тогда нет шансов внедрения SQL. Одним из способов может быть использование Okoman sprintf()
, может быть что-то вроде этого:
$sql = "INSERT INTO table VALUES(".sprintf("%d",$_GET['id']) .")";
хотя я думаю, что это уродливо и плохо. Примерно так приятнее:
$sql = "INSERT INTO table VALUES(".(int)$_GET['id']) .")";
, который просто преобразует значение в int - если это не число, которое может быть приведено к int - вы получите «0», которое может быть или не быть тем, что вы хотите.
Другие альтернативы (и если ваши данные не должны быть числами) включают использование экранирующих функций, таких как add_slashes()
или вышеупомянутых mysql_real_escape_string()
.
ИМХО, лучший способ использовать доступ к базе данных из PHP и очень легко защитить от внедрения SQL - это использовать новую библиотеку PHP PDO (http://php.net/PDO). Это позволяет вам писать строки SQL, которые не содержат никаких данных, и которые впоследствии будут добавлены на самом сервере базы данных. В этой форме нет абсолютно никакого способа сделать SQL-инъекцию.
Вот пример кода:
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $dbh->prepare("INSERT INTO table VALUES (?)");
$stmt->bindParam(1, $_GET['id']);
$stml->execute();
Как вы можете видеть, данные не добавляются в сам SQL-запрос, поэтому их не нужно экранировать.