Защита от SQL Injection – PDO, mysqli

Возможный дубликат:
Лучший способ предотвратить SQL Injection в PHP

Я просто обнаружил, что мой веб-сайт является призрачным.

Так как он подключен к БД и имеет такие функции, как: Регистрация, смена пароля, уведомления и т. Д. … и SUPOSING, он полностью уязвим.

Что я должен искать в коде, чтобы начать делать его безопасным?

Я имею в виду, что я делал некоторые исследования и везде, все говорят о безопасности.

«Использовать PDO».

Msgstr "Использовать mysql_real_escape_string."

Msgstr "Использовать addlashes."

Что именно я должен искать?

"$_POST" and "$_GET" variables?? "$_SESSION" variables? 

SQL-запросы?

 $sql = "select * from user"; $sql = "update user set user="new_user_name"; $sql = "insert into user (user) values ('userid')"; 

Что мне делать в каждом случае? Пожалуйста, помогите мне узнать, что и куда я должен пойти.

Спасибо.

Ниже приведены моменты, которые необходимо учитывать при создании безопасного приложения php.

  1. ИСПОЛЬЗОВАТЬ PDO или mysqli
  2. Никогда не доверяйте никаким входам. Рассмотрим каждую переменную: $ _POST, $ _GET, $ _COOKIE, $ _SESSION, $ _SERVER, как будто они были испорчены. Используйте соответствующие меры фильтрации для этих переменных.
  3. Чтобы избежать атаки XSS, используйте встроенные функции php htmlentities, strip_tags и т. Д., Вставляя пользовательские входные данные в базу данных.
  4. Отключить глобальные регистры в PHP.INI
  5. Отключить «allow_url_fopen» в PHP.INI
  6. Не позволяйте пользователю вводить больше данных, чем требуется. Подтвердите ввод, чтобы разрешить максимальное количество символов. Также проверяйте каждое поле для соответствующих типов данных.
  7. Отключить отчет об ошибках после периода разработки. Он может предоставить информацию о базе данных, которая будет полезна для хакеров.
  8. Используйте одноразовый токен при отправке формы. Если токен существует и соответствует сообщению формы, в противном случае он недействителен.
  9. Использовать параметризованные запросы к базе данных
  10. Использовать хранимые процедуры

Для получения дополнительной информации вы можете использовать Google для каждой точки. Надеюсь это поможет

Что вы должны искать: Любые данные, отправляемые от клиента / пользователя. Sanitize / escape эти данные.

PDO может дезактивировать запросы (используя PDO :: prepare ) и поддерживает несколько SQL-систем.

Для MySQL используйте MySQLi . mysqli_real_escape_string – это функция, используемая для дезинфекции данных, если вы используете MySQL.

Ни один из предоставленных SQL-запросов на самом деле не уязвим для SQL-инъекций.

Уязвимости SQL-инъекций происходят из-за того, что SQL-вход не выполняется должным образом.

Например:

 $sql = "select * from users where user_id =" . $_GET['user_id']; 

Подумайте, передал ли я следующее:

 http://some_server.com/some_page.php?user_id=123%20or%201=1 

Выполнение запроса в результате:

 select * from users where user_id = 123 or 1=1 

Чтобы исправить это, используйте параметризованные запросы:

 $query = "select * from users where user_id = ?" 

Когда вы привязываете значение user_id к запросу, уровень доступа к данным будет корректно покидать входную строку, и будет выполнено следующее:

 select * from users where user_id = '123 or 1=1' which would not return any rows, preventing the injection 

Если вы используете PHP и расширение mysql:

 $sql = "select * from users where user_id = '" . mysql_real_escape_string($_GET['user_id']) . "'"; 

Имейте в виду, что вам нужно избегать ввода ALL, который входит в SQL-запрос:

 $sql = "select id_column from some_table where id = 1"; $stmt = mysqli_query($conn, $sql); if($stmt === false) die(mysqli_error($conn) . "\n"); while($row = mysqli_fetch_assoc($conn, $stmt) { $sql = "update some_other_table set some_value = 'new value' where some_column = '" . mysqli_real_escape_string($conn, $row['id_column']) . "'"; .... } 

Это связано с тем, что значения, которые вы выбираете из базы данных, могут включать символы, которые небезопасны для выполнения в SQL-заявлении, например, имя «O'Hara» или пример. }

Я использую PDO .

Пример этого в вашем случае:

 <?php $stmt = $dbh->prepare("insert into user (user) values (?)"); $stmt->bindParam(1, $name); $name = 'ValueHere'; $stmt->execute(); ?>