Как использовать функцию mysql_real_escape_string в PHP

#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"); 
?>