PHP SQL Injection Prevention

Возможный дубликат:
Как предотвратить 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 будет эмулировать подготовленные операторы / связанные параметры для драйверов, которые их не поддерживают, и также могут переписывать маркеры параметров стиля имени или вопроса в нечто более подходящее, если драйвер поддерживает один стиль, но не другой.