Como usar a function mysql_real_escape_string em PHP

Então, neste programa que eu estou escrevendo, eu realmente pego uma consulta SQL do usuário usando um formulário. Eu então passo a executar essa consulta no meu database.

Eu não sei “confiar” na input do usuário, então eu quero fazer sanitização na input. Estou tentando usar o mysql_real_escape_string mas não conseguiu fazê-lo funcionar.

Aqui está o que eu estou tentando, dado o contributo: 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!"; } 

Isso sempre está me dando o

“Entrada inválida!”

erro.

Quando eu tirar a parte clean_string e simplesmente executar mysql_query na consulta, o

“input inválida”

a mensagem não é emitida. Em vez disso, quando faço isso:

 $rs = mysql_query($query, $db_connection); if (!$rs) { echo "Invalid input!"; } 

NÃO faz saída

“input inválida”.

No entanto, eu preciso usar a function mysql_real_escape_string . O que estou fazendo de errado?

Atualizar:

Dado select * from Actor; Como uma input, encontrei o seguinte.

Usando instruções de eco descobriu que antes de desinfetar, a string contém o valor: select * from Actor; qual é correto. No entanto, depois de desinfetar, ele contém o valor incorreto de select *\r\nfrom Actor; , daí a mensagem de erro. Por que mysql_real_escape_string está fazendo isso?

use-o nos valores reais na sua consulta, e não na própria seqüência de consulta inteira.

exemplo:

 $username = mysql_real_escape_string($_POST['username']); $query = "update table set username='$username' ..."; $rs = mysql_query($query); 

Em vez de usar a extensão mysql desatualizada, mude para PDO . Os parâmetros de indicação preparados não são vulneráveis ​​à injeção porque mantêm os valores separados das declarações. Declarações preparadas e PDO têm outras vantagens, incluindo desempenho, facilidade de uso e resources adicionais. Se você precisar de um tutorial, tente ” Escrever Scripts MySQL com PHP e PDO “.

mysql_real_escape_string() é a function de escape de cadeia . Isso não faz nenhuma input segura, apenas valores de seqüência de caracteres, não para uso com cláusulas LIKE, e os números inteiros precisam ser mantidos de forma diferente ainda.

Um exemplo mais fácil e mais universal pode ser:

  $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 

Observe como cada variável ainda deve ser incluída por ' citações simples para seqüências SQL. (Caso contrário, o escape não seria inútil.)

Você deve usar mysql_real_escape_string para escaping dos parâmetros para a consulta e não para a própria consulta.

Por exemplo, digamos que você tem duas variables ​​que recebeu de um formulário. Então, seu código ficaria assim:

 $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); 

manual mysql_real_escape_string ()

Escapa caracteres especiais em uma seqüência de caracteres para uso em uma instrução SQL

Então, você não pode escaping da consulta inteira, apenas dados … porque escapingá de todos os caracteres inseguros como aspas (partes válidas da consulta).

Se você tentar algo assim (para escaping da consulta inteira)

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

A saída é

INSERIR-SE em alguns VALORES (\ ‘xyz \’, \ abc \ ‘, \’ 123 \ ‘);

e isso não é uma consulta válida mais .

Isso funcionou para mim. 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: %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"); ?>