Я действительно не понимаю инъекцию mysql? Что это?

Я не имею опыта с mysql или php, и я продолжаю упоминать, что в моих вопросах, но люди продолжают говорить, что вам нужна защита от инъекций mysql, и я искал ее, и я действительно не понимаю. Может кто-нибудь мне помочь? Я так новичок в mysql, и у меня проблемы с ним

Вот мой код:

как это может быть улучшено? Когда я перехожу к просмотру исходного кода, щелкнув правой кнопкой мыши на сайте, ни один из php / mysql не появится.

<?php $conn = mysql_connect("", "", ""); if (!$conn) { echo "Unable to connect to DB: " . mysql_error(); exit; } $search = "%".$_POST["search"]."%"; $searchterm = "%".$_POST["searchterm"]."%"; if (!mysql_select_db("")) { echo "Unable to select mydbname: " . mysql_error(); exit; } $sql = "SELECT name,lastname,email FROM test_mysql WHERE name LIKE '%".$search."%' AND lastname LIKE '%".$searchterm."%'"; $result = mysql_query($sql); if (!$result) { echo "Could not successfully run query ($sql) from DB: " . mysql_error(); exit; } if(empty($_GET['search'])){ // or whatever your field's name is echo 'no results'; } else { performSearch(); // do what you're doing right now } if (mysql_num_rows($result) == 0) { echo "No rows found, nothing to print so am exiting"; exit; } while ($row = mysql_fetch_assoc($result)) { echo '<br><br><div class="data1">'; echo $row["name"]; echo '</div><br><div class="data2">'; echo $row["lastname"]; echo '</div><br><div class="data3">'; echo $row["email"]; echo '</div>'; } mysql_free_result($result); ?> 

SQL-инъекция – это имя атаки, но основной проблемой является недостаточная проверка ввода . Возьмите следующий код:

 $search = $_POST['search']; $sql = "SELECT name,lastname,email FROM test_mysql WHERE name LIKE '%".$search."%'"; $result = mysql_query($sql); 

Что произойдет, если кто-нибудь войдет в O'Reilly в форме поиска?

Ну, запрос в конечном итоге строится как:

 SELECT name, lastname, email FROM test_mysql WHERE name LIKE '%O'Reilly%' 

Это недействительный SQL-запрос, но просто приведет к сообщению об ошибке. Поэтому ваш код не работает ; он не может обрабатывать входные данные, содержащие ' .

Теперь, давайте рассмотрим злонамеренного человека, Мэллори. Причинение ошибки не помогает Мэллори в его злых путях, если он не хочет подчеркнуть администраторов баз данных, которые читают все журналы ошибок. Он вводит: %'; INSERT INTO test_mysql name,lastname,email VALUES('mal','ory','malory@evil.com');-- %'; INSERT INTO test_mysql name,lastname,email VALUES('mal','ory','malory@evil.com');-- Теперь полный запрос SQL

 SELECT name, lastname, email FROM test_mysql WHERE name LIKE '%%'; INSERT INTO test_mysql name,lastname,email VALUES('mal','ory','malory@evil.com'); --%' 

Последняя строка – комментарий и игнорируется. Мэллори теперь может писать произвольные вещи в базу данных!

Обратите внимание, что для этого требуется возможность выполнить более одной команды в одном MySQL. Если эта функция не включена, Мэллори должен прибегать к использованию подзапросов и предикатов. В некоторых случаях Мэллори не может просматривать всю таблицу (например, он должен иметь возможность просматривать свои покупки в интернет-магазине, а не других клиентов). Он может просто ввести ' OR ''=' чтобы увидеть весь контент запроса.

Вы можете защитить себя, либо ускоряя значения, например:

 $search = $_POST['search']; $sql = "SELECT name,lastname,email FROM test_mysql WHERE name LIKE '%". mysql_real_escape_string($search) ."%'"; $result = mysql_query($sql); 

В качестве альтернативы, используйте PDO и подготовленные заявления :

 $sql = "SELECT name,lastname,email FROM test_mysql WHERE name LIKE :search"; $statement = $pdo->execute($sql, array(':search' => '%' . $_POST['search'] . '%')); 

SQL-инъекция лучше всего обобщается этим комиком :

Вы действительно называли своего сына Робертом?); УСПЕШНЫЙ СТОЛ Студенты -? "

bobby-tables.com объясняет, как защищаться от него на разных языках.

Вам нужно избегать ваших запросов с помощью строки mysql_real_escape:

 WHERE name LIKE '%".mysql_real_escape_string($search)."%' AND lastname LIKE '%".mysql_real_escape_string($searchterm)."%'"; 

Здесь вы можете увидеть примеры для SQL-инъекций: http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php

Обратите внимание, что у вас не только SQL-инъекция в вашем примере кода, но также есть дыра безопасности XSS :

Код ужаса

 while ($row = mysql_fetch_assoc($result)) { echo '<br><br><div class="data1">'; echo $row["name"]; echo '</div><br><div class="data2">'; echo $row["lastname"]; echo '</div><br><div class="data3">'; echo $row["email"]; echo '</div>'; } 

Вы эхом отзываете неанитированный вывод на HTML-страницу.
Если пользователь ввел html-код в поля name , name и / или email .
Они могут вводить произвольный html на вашу страницу.
Это называется скриптовым сервером или XSS.

Вы должны всегда дезинфицировать результат, который вы эхо:

Безопасный код

 while ($row = mysql_fetch_assoc($result)) { echo '<br><br><div class="data1">'; echo htmlentities($row["name"]); <<-- sanitize your output! echo '</div><br><div class="data2">'; echo htmlentities($row["lastname"]); echo '</div><br><div class="data3">'; echo htmlentities($row["email"]); echo '</div>'; } 

См.: Каковы наилучшие методы предотвращения атак xss на PHP-сайте

Вы должны конкретно посмотреть на эту строку:

 $sql = "SELECT name,lastname,email FROM test_mysql WHERE name LIKE '%".$search."%' AND lastname LIKE '%".$searchterm."%'"; 

Каковы возможные значения, которые пользователи могли бы отправлять в свой почтовый запрос, чтобы сделать это, сделать что-то, чего вы не хотите (например, DROP table!)

Это то, что SQL-инъекция, и если она не защищена от нее, может быть очень вредной.

SQL Injection – это то, где enduser может вставлять SQL-код в ваши запросы и беспорядок с вашими базами данных.

Например, если вы запускали: UPDATE users SET userID=" + userID + " WHERE id = " + id + "; ;

Пользователь может поместить пользователей «; DROP TABLE», так как их ввод для userID и SQL будет выполнять этот запрос точно. Он не может обнаружить «плохой» запрос.

Вы можете защитить себя, используя параметризованные запросы, которые есть несколько способов сделать на PHP, и вы можете просто «sql parameters php» Google.