Возможный дубликат:
Как предотвратить SQL-инъекцию в PHP?
Я работаю на веб-сайте для потокового видео для моей библиотеки колледжа.
Я использую PHP и MySql.
Я не использовал какие-либо параметризованные запросы в этом проекте.
Недавно я узнал о SQL Injections.
Теперь, когда мой код почти завершен, и я должен представить проект в ближайшие два дня, как я могу теперь заверить, что мой код не подвержен SQL-инъекциям?
Преобразование всего объекта в параметризованный интерфейс – это то, что я не могу сделать сейчас?
Что мне делать сейчас, чтобы избежать инъекций SQL на моем сайте?
Помощь Plz!
Основная идея предотвратить инъекции SQL (если не использовать подготовленные заявления) заключается в том, чтобы избежать ваших данных .
Когда вы добавляете некоторое ожидаемое целочисленное значение в SQL-запрос, убедитесь, что это целое число, используя intval()
.
Когда у вас есть десятичное / числовое поле в таблице, используйте floatval()
.
И когда у вас есть строка (char, varchar, text) в вашей таблице, используйте функцию, предоставленную вашим API, чтобы избежать строк:
mysql_real_escape_string()
mysqli_real_escape_string()
PDO::quote()
Я действительно рекомендую вам вернуться и сделать это правильно с параметризованными запросами. Это единственный надежный путь к безопасности. Вероятно, это не займет слишком много времени, чтобы сделать это, как только вы начнете.
Вы также должны знать, что веб-сайты никогда не «завершены». Когда вы запускаете сайт, ваша работа только началась. Исправление проблем безопасности, когда вы узнаете о них, является частью этого, и это ничем не отличается.
Вы хотите удостовериться, что любой пользователь предоставил входные данные, которые используются в SQL-запросах, экранируется с помощью функции PHP mysql_real_escape_string
и если вы позволяете людям отправлять текст для запуска htmlentities
в предоставленном тексте, так что XXS невозможно. Если возможно, пользователь белого списка предоставил вход и отменил все остальное
Это просто касается поверхности того, что вы можете сделать, но посмотрите на экранирование запросов и предотвращение межсайтового скриптинга.
Используйте PDO (или, альтернативно, mysqli или некоторый уровень абстракции) и подготовленные операторы.
Быстрый пример:
$pdo = new PDO($dsn); $stmt = $pdo->prepare("SELECT name FROM users WHERE id = ?"); $stmt->execute(array($unsafe_id)); $name = $stmt->fetchColumn();
В этом примере $unsafe_id
будет безопасен в использовании. Процитировать страницу руководства:
Вызов PDO :: prepare () и PDOStatement :: execute () для операторов, которые будут выдаваться несколько раз с разными значениями параметров, оптимизирует производительность вашего приложения, позволяя водителю согласовывать кеширование клиентов и / или серверов в плане запроса и метаинформации и помогает предотвратить атаки SQL-инъекций, устраняя необходимость вручную указывать параметры.
PDO будет эмулировать подготовленные операторы / связанные параметры для драйверов, которые их не поддерживают, и также могут переписывать маркеры параметров стиля имени или вопроса в нечто более подходящее, если драйвер поддерживает один стиль, но не другой.