#php #mysql #mysql-real-escape-string
#php #mysql #mysql-реальная escape-строка
Вопрос:
Итак, в этой программе, которую я пишу, я фактически получаю SQL-запрос от пользователя с помощью формы. Затем я продолжаю выполнять этот запрос в своей базе данных.
Я знаю, что не следует «доверять» пользовательскому вводу, поэтому я хочу выполнить очистку входных данных. Я пытаюсь использовать mysql_real_escape_string
, но не смог заставить ее работать.
Вот что я пытаюсь, учитывая входные: select * from Actor;
//"query" is the input string:
$clean_string = mysql_real_escape_string($query, $db_connection);
$rs = mysql_query($clean_string, $db_connection);
if (!$rs)
{
echo "Invalid input!";
}
Это ВСЕГДА дает мне
«Неверный ввод!»
ошибка.
Когда я извлекаю clean_string
часть и просто запускаю mysql_query
запрос,
«неверный ввод»
сообщение не выводится. Скорее, когда я делаю это:
$rs = mysql_query($query, $db_connection);
if (!$rs)
{
echo "Invalid input!";
}
Это не выводит
«неверный ввод».
Однако мне нужно использовать mysql_real_escape_string
функцию. Что я делаю не так?
Обновить:
Учитывая select * from Actor;
в качестве входных данных, я обнаружил следующее.
Используя инструкции echo, я обнаружил, что перед очисткой строка содержит значение: select * from Actor;
, которое является правильным. Однако после очистки она содержит неверное значение select *rnfrom Actor;
, отсюда и сообщение об ошибке. Почему mysql_real_escape_string
это делается?
Комментарии:
1. Я не понимаю часть ввода… Вы извлекаете весь запрос из пользовательского ввода или только некоторые данные, чтобы использовать позже для генерации запроса? Я надеюсь, что это не первый случай или у вас серьезные проблемы с безопасностью.
2. Попробуйте этот урок net.tutsplus.com/tutorials/php /…
3. Измените: повторите «Недопустимый ввод»; На это: die(‘Недопустимый ввод: ‘ . mysql_error()); Чтобы увидеть, получаете ли вы ошибку mysql.
4. Вы могли бы рассмотреть вариант использования интерфейса mysqli с параметризованными запросами и избежать всей проблемы. Это то, что рекомендует mysql.
5. Wh1T3h4Ck5: Вероятно, мне следовало указать, что это всего лишь небольшой проект для курса, который я прохожу. Это правда, что я беру в качестве входных данных весь запрос. Не волнуйтесь, я не прошу вас, ребята, делать мою домашнюю работу. Очевидно, что эта ошибка является незначительной частью моего реального проекта.
Ответ №1:
используйте ее для фактических значений в вашем запросе, а не для всей строки запроса.
пример:
$username = mysql_real_escape_string($_POST['username']);
$query = "update table set username='$username' ...";
$rs = mysql_query($query);
Ответ №2:
Вместо того, чтобы использовать устаревшее расширение mysql, переключитесь на PDO. Параметры подготовленной инструкции не подвержены внедрению, поскольку они хранят значения отдельно от инструкций. Подготовленные инструкции и PDO обладают другими преимуществами, включая производительность, простоту использования и дополнительные функции. Если вам нужен учебник, попробуйте «Написание скриптов MySQL с помощью PHP и PDO«.
Ответ №3:
mysql_real_escape_string()
является ли функция экранирования строки. Это не делает никакой ввод безопасным, просто строковые значения, не для использования с предложениями LIKE, а целые числа все еще нужно обрабатывать по-другому.
Более простым и универсальным примером может быть:
$post = array_map("mysql_real_escape_string", $_POST);
// cleans all input variables at once
mysql_query("SELECT * FROM tbl WHERE id='$post[id]'
OR name='$post[name]' OR mtime<'$post[mtime]' ");
// uses escaped $post rather than the raw $_POST variables
Обратите внимание, что каждая переменная по-прежнему должна быть заключена в '
одинарные кавычки для строк SQL. (В противном случае экранирование было бы бессмысленным.)
Ответ №4:
Вы должны использовать mysql_real_escape_string
для экранирования параметров запроса, а не всего самого запроса.
Допустим, у вас есть две переменные, полученные из формы. Тогда ваш код будет выглядеть следующим образом:
$Query = sprintf(
'INSERT INTO SomeTable VALUES("%s", "%s")',
mysql_real_escape_string($_POST['a'], $DBConnection),
mysql_real_escape_string($_POST['b'], $DBConnection)
);
$Result = mysql_query($Query, $DBConnection);
Ответ №5:
руководство mysql_real_escape_string()
Экранирует специальные символы в строке для использования в инструкции SQL
Таким образом, вы не можете экранировать весь запрос, только данные … потому что это экранирует все небезопасные символы, такие как кавычки (допустимые части запроса).
Если вы попробуете что-то подобное (для экранирования всего запроса)
echo mysql_real_escape_string("INSERT INTO some_table VALUES ('xyz', 'abc', '123');");
Вывод
ВСТАВИТЬ В some_table ЗНАЧЕНИЯ (‘xyz’, ‘abc’, ‘123’);
и это больше недопустимый запрос.
Ответ №6:
У меня это сработало. dwolf (wtec.co )
<?php
// add data to db
require_once('../admin/connect.php');
$mysqli = new mysqli($servername, $username, $password, $dbname);
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %sn", mysqli_connect_error());
exit();
}
$post = $mysqli->real_escape_string($_POST['name']);
$title = $mysqli->real_escape_string($_POST['message']);
/* this query with escaped $post,$title will work */
if ($mysqli->query("INSERT into press (title, post) VALUES ('$post', '$title')")) {
printf("%d Row inserted.n", $mysqli->affected_rows);
}
$mysqli->close();
//header("location:../admin");
?>