Как безопасно использовать MySQLi?
Поэтому я недавно перешел на использование MySQLi. И у меня есть несколько вопросов по этому поводу.
Мой текущий код для получения данных
$current = "SELECT * FROM hi where username='me'";
$result = $connect->query($current) or die($mysqli->error.__LINE__);
$row = $result->fetch_assoc();
и мое выполнение запроса
$current = "SELECT * FROM hi, где username='me'"; $result = $connect->query($current) или die ($ mysqli-> error.LINE);
Первый вопрос, это правильный путь?
И как это более безопасно, чем метод mysql_? (Я слышал, что это предотвращает инъекции или что-то)
И наконец, кроме использования MySQLi, что еще мне делать? Достаточно ли защищен мой код?
Ранее я использовал mysql_real_escape_string(htmlspecialchars($string)) для любых данных, которые будут использоваться в запросе mysql, мне все еще нужно их использовать? Поскольку я сейчас использую MySQLi.
Какие еще вещи я должен принять к сведению, чтобы сделать мой сайт безопасным? htmlspecialchars какие-либо пользовательские входы?
Спасибо!
1 ответ
о тебе mysqli_query
использовать:
И как это более безопасно, чем метод mysql_? (Я слышал, что это предотвращает инъекции или что-то)
Здесь у вас нет проблемы с инъекцией, так как вы не используете какой-либо пользовательский ввод. Так что MySQL или mysqli_
кажется эквивалентным.
по вопросам инъекций:
Тем не менее, если вы должны использовать пользовательский ввод (например, $_POST
или же $_GET
переменные) лучше использовать подготовленные высказывания. Их синтаксис такой:
$query = SELECT * FROM mytable WHERE col1=? AND col2=?;
$stmt = $db->prepare($query);
$stmt->bind_param('ss',$_POST['col1'],$_POST['col2']);//I put 2 s because I want 2 params. s stands for strings, i for integer. For that part PHP and mysqli extension offers you two alternative syntaxes. They give the same result but it depends on what you understand the best.
во-первых: с помощью
bind_result
, Эта функция должна быть вызвана перед выполнением. Он свяжет ваш результат с переменными, указанными вами в параметрах. Первый столбец заполнит первую переменную, второй столбец - второй параметр... Основная проблема заключается в том, что он отсекает вас от всего API-интерфейса mysqli_result, который имеетfetch_all
,fetch_assoc
или жеfectch_object
,$stmt->bindResult($array['col1'], $array['col2'], $array['col3']); $stmt->execute(); while($stmt->fetch_assoc()){ var_dump($array); }
второе: использование
get_result
, Это позволяет вам использоватьmysqli_result
API, который вы уже используете, когда используете$db->query()
, Он доступен только тогда, когда вы используете mysqlnd в качестве драйвера. Если вы используете php 5.3+, то это драйвер по умолчанию, но с php 5.1 или 5.2 (в основном, хостер 1&1 меньше 5.2), это не всегда так.$stmt->execute(); $result = $stmt->get_result()->fetch_all(); foreach($result as $row){ //handle your rows }
о побеге:
mysql_real_escape_string (htmlspecialchars ($ строка))
В MySQL, вы можете использовать mysqli_real_escape_string
, htmlspecialchars
Функция бесполезна, когда речь заходит о базе данных. Это только для отображения.