одна идея, которую я имел, состояла в том, чтобы проверить строку на наличие общих слов / фраз, которые используются в внедрении SQL, которые никогда не используются в приложении, выполняющем запросы.Если найдено, не запускайте запрос и не предупреждайте администраторов.
Чрезвычайно плохая идея.
Решение состоит в том, чтобы использовать PDO: http://php.net/manual/en/ref.pdo-mysql.php
и передать все $ переменные с использованием параметров.
Если вам нужно использовать динамический SQL,убедитесь, что вы проверили введенные данные в белый список.
См. этот вопрос о том, как безопасно это сделать: Как предотвратить внедрение SQL с динамическими именами таблиц?
Теперь вы сохранены.
Если вы не можете использовать PDO, используйте mysql_real_escape_string()
.
Вот пример:
$var = mysql_real_escape_string($_POST['unsafe_value']);
$query = "SELECT * FROM user WHERE username = '$var' ";
// The quotes are vital, without them ^ ^
//you will may get syntax errors and mysql_real.... will not protect you!
Вы можете использовать это только для параметров , а не для таблицы,столбец, имена базы данных или конструкции SQL, также не забывайте всегда заключать в кавычки '$vars'
.
Для всех значений, кроме значений, вы должны использовать белый список.
Обратите внимание, что addslashes
не работает и не должен использоваться!
Для целочисленных значений вы можете использовать intval (), но я советую против этого: это не экономит время, затрудняет чтение вашего кода и нарушает правило всегда использовать mysql_real_escape_string()
.