PHP mysql_real_escape_string () ->

3 Cevap php

PHP / MySQL ile dizeleri sıyırma / kaçan sorunlar yaşıyorum - hep gereksiz bölü gibi görünüyor.


Bir örnek olarak aşağıdaki dize alalım:

<span style="text-decoration:underline;">underline</span>


When adding a string to the database, I'm escaping it with mysql_real_escape_string() ve the following gets stored in the database (EDIT: checked this by querying the database directly with mysql app):

<span style=\\\"text-decoration:underline;\\\">underline</span>


When reading back out of the database, I'm passing the string through stripslashes() ve the following is returned:

<span style=\"text-decoration:underline;\">underline</span>


Since the quotes vardır still escaped, it breaks the html ve the text is not underlined.


  1. Neden mysql_real_escape_string(), üç bölü ekleyerek, ve stripslashes() iki eğik çizgi kaldırıyor? Ben her ikisini de bir çizgi eklemek / kaldırmak için beklenebilir.
  2. Bunu nasıl oluyor önleyebilirsiniz?
  3. Bu doğru bir şekilde yaklaşıyor muyum?

3 Cevap

Best Solution

Php.ini dosyasında, oran magic_quotes_gpc yönergesi üzerinde ayarlanmış olduğunu vardır. Bu güvenlik için devre dışı bırakılmalıdır. Eğer php.ini dosyası (paylaşılan bir bilgisayar üzerinde örn.) erişiminiz yoksa, her zaman (bu bir apache sunucusu varsayarak) bir. Htaccess yönergesini kullanarak aynı gerçekleştirebilirsiniz.

Php.ini

magic_quotes_gpc Off

.: Htaccess dosyasında

php_flag magic_quotes_gpc Off

Why is this happening?

Bu oluyor nedeni mantığın aşağıdaki derse kaynaklanmaktadır.

  1. A string that needs escaping is sent to the server.
    • This is my string. It's awesome.
  2. Magic Quotes escapes the apostrophe before it gets to your code.
    • This is my string. It\'s awesome
  3. mysql_real_escape_string now has two characters to escape, the backslash \\ as well as the apostrophe \'.
    • This is my string. It\\\'s awesome
  4. Bu yeni süper kaçtı dize veritabanında saklanır.
  5. When the string is retrieved from the database, it get's passed to stripslashes. This removes the two escapes added in step 3, but since one of the backslashes has been escaped stripslashes thinks it belongs.
    • This is my string. It\'s awesome

Eğer ters eğik çarpar sayısı her zaman olduğu gibi, veritabanına bu dizeleri yeniden gönderdiğinizde, bu sorun gerçekten elden alabilirsiniz.

Alternative Solution

A hızlı ve kolay bir alternatif sadece mysql_real_escape_string için dize geçirmeden önce magic_quotes tarafından eklenen eğik kaldırmak olacaktır.

$str = stripslashes($_POST['str']);
$str = mysql_real_escape_string($str);

Veritabanına bir dize eklerken, ben mysql_real_escape_string() ve aşağıdaki veritabanında saklanan alır ile kaçan ediyorum:

<span style=\\\"text-decoration:underline;\\\">underline</span>

Hayır değil. Bir sql sorguda dizeleri kaçmak, sadece sorgudaki verileri taşımaktır. Veritabanı sorgu ayrıştırır ve herhangi bir ekstra eğik çizgi olmadan, veritabanındaki verileri saklar. Eğer veritabanından veri almak zaman Böylece, not şey Unescape gerekir. Bu ortak bir kanı var.

Eğer çıkış aşırı bölü olduğunu fark ederseniz, muhtemelen sihirli tırnak açık var. Turn them off.

Edit:

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)

Gördüğünüz gibi, sorgu veri için sorgulayarak zaman çıkıyor nasıl veritabanı içinde ve sonuç göründüğünden daha kaçan bir düzey daha vardır. Senin durumunda, probably oluyor, sihirli tırnak açılır ve sonra bir sorguda onları gömmeden önce dizeleri kaçış olması budur. Bu veri tahrifat, çift kaçan yol açar. Doğru çözüm gibi kaçan dizeleri tutmak, ama sihirli tırnak kapatmak için. Bu veritabanı çıkar gibi ve don't verilere şey. Zaten sistemde veri ilk önce temizlenmesi gerektiğini unutmayın.

get_magic_quotes_gpc() SERVER kapalı ise, bu yüzden sadece biz kullanabilirsiniz

$data= mysql_real_escape_string($_POST['data']);

get_magic_quotes_gpc() SERVER üzerinde ise, biz kullanmak zorunda

$data= mysql_real_escape_string(stripslashes($_POST['data']));

aksi takdirde veri ile iki ters eğik çizgi ekleyin.

Ayrıca başka bir çözüm datadase alınamayacak ederken biz stripslashes($data) kullanabilirsiniz biz sadece kullanmaz ise mysql_real_escape_string($_POST['data']);