PHP mysql_real_escape_string () -> stripslashes () deixando várias barras
-
19-09-2019 - |
Pergunta
Estou tendo problemas escapando / descascamento cordas com PHP / MySQL -. Há sempre parece ser barras redundantes
Vamos dar a seguinte cadeia como um exemplo:
<span style="text-decoration:underline;">underline</span>
Ao adicionar uma string para o banco de dados, eu estou fugindo com mysql_real_escape_string()
eo seguinte é armazenada no banco de dados ( Editar : verificado este, consultando o banco de dados diretamente com aplicativo mysql):
<span style=\\\"text-decoration:underline;\\\">underline</span>
Ao ler de volta para fora do banco de dados, eu estou passando a corda através stripslashes()
eo seguinte é devolvido:
<span style=\"text-decoration:underline;\">underline</span>
Desde as cotações ainda estão escapou, ele quebra o html eo texto não está sublinhado.
- Por que é
mysql_real_escape_string()
adição de três barras estripslashes()
removendo duas barras? Eu esperaria que eles tanto para adicionar / remover uma barra. - Como posso evitar que isso aconteça?
- Am I aproximando esta a maneira correta?
Solução
Melhor Solução
Em seu arquivo php.ini, as probabilidades são que a magic_quotes_gpc
directiva está ativado. Este deve ser desativado por motivos de segurança. Se você não tem acesso ao arquivo php.ini (ex. Em um servidor compartilhado), você sempre pode fazer o mesmo usando uma diretiva .htaccess (assumindo que este é um servidor apache).
Em seu php.ini
magic_quotes_gpc Off
Em um arquivo .htaccess:
php_flag magic_quotes_gpc Off
Por que isso está acontecendo?
A razão que esta está acontecendo é devido ao seguinte curso de lógica.
- Uma cadeia que as necessidades que se escapa é enviado para o servidor.
-
This is my string. It's awesome.
-
- Magic Quotes escapa o apóstrofo antes que ele chegue ao seu código.
-
This is my string. It\'s awesome
-
-
mysql_real_escape_string
agora tem dois personagens de escapar, o\\
barra invertida, bem como a\'
apóstrofo.-
This is my string. It\\\'s awesome
-
- Esta nova string escapou super é armazenado no banco de dados.
- Quando a corda é recuperado do banco de dados, se do passado para
stripslashes
. Isso remove os dois escapes adicionou na etapa 3, mas desde que uma das barras invertidas foi escapoustripslashes
pensa que pertence.-
This is my string. It\'s awesome
-
Este problema pode realmente sair da mão quando você voltar a apresentar essas seqüências no banco de dados, já que cada vez que o número de barras invertidas multiplica.
Alternativa Solução
Uma alternativa rápida e fácil seria a de simplesmente remover as barras adicionadas por magic_quotes
antes de passar a corda para mysql_real_escape_string
.
$str = stripslashes($_POST['str']);
$str = mysql_real_escape_string($str);
Outras dicas
Ao adicionar uma string para o banco de dados, eu estou fugindo com
mysql_real_escape_string()
eo seguinte é armazenada no banco de dados:
<span style=\\\"text-decoration:underline;\\\">underline</span>
Não, não é. Quando você escapar cordas em uma consulta SQL, é apenas para transportar os dados na consulta. O banco de dados analisa a consulta e armazena os dados no banco de dados, sem quaisquer cortes extras. Assim, quando você recuperar dados do banco de dados, você deve não nada unescape. É um equívoco comum.
Se você achar que há barras excesso na saída, você provavelmente tem magic quotes ligado. Transformá-los fora .
Editar:
mysql> create table foo (bar text) ;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO foo (bar) VALUES ("<span style=\\\"text-decoration:underline;\\\">underline</span>");
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM foo;
+-------------------------------------------------------------+
| bar |
+-------------------------------------------------------------+
| <span style=\"text-decoration:underline;\">underline</span> |
+-------------------------------------------------------------+
1 row in set (0.00 sec)
Como você pode ver, a consulta tem mais um nível de escapar do que os dados aparecem no banco de dados e, consequentemente, como ele sai ao consultar por ele. No seu caso, o que é provavelmente acontecendo, é que você tem magic quotes ligados e então você escapar strings antes de integrá-las em uma consulta. Isto leva a dobrar-escapar, adulteração seus dados. A solução apropriada é manter escapar strings como você faz, mas desligar magic quotes. E não fazer nada sobre os dados à medida que sai da base de dados. Tenha em atenção que os dados já nas necessidades do sistema para ser limpo em primeiro lugar.
Se get_magic_quotes_gpc()
está desligado no SERVER, por isso só podemos usar
$data= mysql_real_escape_string($_POST['data']);
Se get_magic_quotes_gpc()
está no SERVER, temos que usar
$data= mysql_real_escape_string(stripslashes($_POST['data']));
caso contrário adicionar duas barras invertidas com os seus dados.
Também uma outra solução é que podemos usar stripslashes($data)
enquanto buscar a partir datadase Se usarmos apenas usar mysql_real_escape_string($_POST['data']);