Как использовать функцию mysql_real_escape_string в PHP - PullRequest
5 голосов
/ 17 апреля 2011

Итак, в этой программе, которую я пишу, я на самом деле получаю запрос 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 *\r\nfrom Actor;, поэтому появляется сообщение об ошибке.Почему mysql_real_escape_string делает это?

Ответы [ 6 ]

13 голосов
/ 17 апреля 2011

используйте его для фактических значений в вашем запросе, а не для всей строки запроса.

пример:

$username = mysql_real_escape_string($_POST['username']);
$query = "update table set username='$username' ...";
$rs = mysql_query($query);
1 голос
/ 17 апреля 2011

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. (В противном случае побег будет бессмысленным.)

1 голос
/ 17 апреля 2011

Вместо того чтобы использовать устаревшее расширение mysql, переключитесь на PDO . Подготовленный оператор параметры не уязвимы для внедрения, поскольку они хранят значения отдельно от операторов.Подготовленные операторы и PDO имеют другие преимущества, включая производительность, простоту использования и дополнительные функции.Если вам нужен учебник, попробуйте " Написание сценариев MySQL с PHP и PDO ".

0 голосов
/ 18 июля 2015

Это сработало для меня. Двулф (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: %s\n", 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"); 
?>
0 голосов
/ 17 апреля 2011

manual mysql_real_escape_string ()

Экранирует специальные символы в строке для использования в операторе SQL

Таким образом, вы не можете выйти из целогозапрос, просто данные ... потому что он будет экранировать все небезопасные символы, такие как кавычки (допустимые части запроса).

Если вы попробуете что-то подобное (для экранирования всего запроса)

echo mysql_real_escape_string("INSERT INTO some_table VALUES ('xyz', 'abc', '123');");

Выходные данные

INSERT INTO some_table VALUES (\ 'xyz \', \ 'abc \', \ '123 \');

и , то естьзапрос больше не действителен .

0 голосов
/ 17 апреля 2011

Вы должны использовать 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);
...