2009-07-29 42 views
4

我很沮丧。我希望能够用单引号插入到我的数据库名称中 - 例如,O'Connor。mysql_real_escape_string和单引号

所以,插入数据库时​​,我做的:

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

然后我插入$ LNAME到数据库。

当它在DB中时,它显示为O'Connor。

所以,如果我在我的web应用程序回顾过去的名字,我将不得不使用:

$lname = stripslashes($r["lname"]); 

这一切似乎很好地工作。但是,我有一个搜索功能,它将搜索姓氏并显示结果。当我搜索时,我必须搜索O'Connor以获得任何结果。

在我搜索后,您会看到文本框会自动存储刚才搜索的内容(使用会话)。所以我的代码是这样的:

$search = mysql_real_escape_string($_GET['search']); 
$_SESSION['search'] = $search; 

就像我以前说过,当我搜索,我必须使用“O \'康纳”,然后我搜索后,在文本框中的值变为“澳\\\ 'Connor'

试图弄清楚这一直很令人沮丧。有谁知道我做错了什么?谢谢!

编辑:

这里是我的php5.ini文件,关于魔术引号:

; Magic quotes 
; 

; Magic quotes for incoming GET/POST/Cookie data. 
magic_quotes_gpc = On 

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. 
magic_quotes_runtime = Off 

; Use Sybase-style magic quotes (escape ' with '' instead of \'). 
magic_quotes_sybase = Off 

然而,我的网站托管在GoDaddy的,我没有权限编辑该文件:(

回答

7

这听起来像Magic Quotes在你的PHP配置中启用。

要检查它是否真正启用:

echo get_magic_quotes_gpc(); 

To disable,编辑php.ini文件:

; Magic quotes 
; 

; Magic quotes for incoming GET/POST/Cookie data. 
magic_quotes_gpc = Off 

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. 
magic_quotes_runtime = Off 

; Use Sybase-style magic quotes (escape ' with '' instead of \'). 
magic_quotes_sybase = Off 

还是这行添加到您的.htaccess:

php_flag magic_quotes_gpc Off 
+0

他没有魔法引号,他只是逃避逃脱的价值。 – 2009-07-29 15:14:21

+0

我看不到他在哪里逃跑两次。对我来说,好像$ _POST ['lname']已经被转义了,所以在调用mysql_real_escape_string之后将它添加到数据库中会将它存储在它的转义状态中。 – jimyi 2009-07-29 15:18:10

+0

请参阅我的编辑。似乎魔术引号已打开,但我无法编辑php.ini文件,因为它位于GoDaddy上... – littleK 2009-07-29 15:29:34

-2

您只需要执行搜索查询mysql_real_escape_string就可以了,它应该完全没问题。但是,最好的办法是永远不要存储它,而只是转义它,一切都会进入数据库。

相反,这样做:

 
$_SESSION['search'] = $_GET['search']; 
$search = mysql_real_escape_string($_GET['search']); 
1

魔术引号已启用。这意味着任何放置在帖子后或者其他类似位置的东西都会自动转义,这样开始的程序员就不用担心它了。如果我没有记错,它在当前版本的PHP中已被弃用。

你想做的事来处理这个问题,并有脚本运行的任何配置相同什么如下:

function fixinput($value){ 
    if (get_magic_quotes_gpc()){ 
     $value = stripslashes($value); 
    } 

    return mysql_real_escape_string($value); 
} 

您可能需要进一步修改这用引号括非数字数据,这是一个常见的变化,但我发现最好手动放置这些引号。

1

小编辑到fixinput功能检查,如果安装的PHP确实有真正的转义字符串(老版本没有):

function fixinput($value){ 
    if (get_magic_quotes_gpc()){ 
     $value = stripslashes($value); 
    } 

    if (function_exists('mysql_real_escape_string')) { 
     return mysql_real_escape_string($value); 
    } 
    else { 
     return mysql_escape_string($value); 
    } 
    } 
-1

我不检查get_magic_quotes_gpc是开/关。

我只是做$lname = mysql_real_escape_string(stripslashes($_POST['lname']));所以如果没有任何引用的文本,它不会去掉斜杠..如果有引用它将剥离它们。

它对我来说是奇迹!

+0

好的,但取决于使用的文本,这可能会改变用户提交的文本。在大多数情况下,它会起作用,但不是全部。另外,它可能只是因为你一直处于魔法引号开启的环境中,在这种情况下你不会有任何麻烦(直到你尝试将它移植到另一个环境中)。 – krdluzni 2009-07-29 15:53:05

+0

@kdluzni .. wtf?我写道,它对我来说是有效的奇迹(它意味着可能无法为每个人工作“奇迹”.. ..我也提到我不检查get_magic ..因为我知道它是开启的。 – TigerTiger 2009-07-30 07:54:28

+0

是的,但只是说你不喜欢没有解释为什么可能会导致OP相信某些事情总是安全的,如果你的环境适用于这种情况,这很好,但是这种方法可能有缺陷,指出它们很重要。此外,magic_quotes是不推荐使用,并且从PHP 6开始将被删除。那时,您的代码将停止正常工作,而检查gpc的代码将正常工作(直到他们某天移除了检查函数,但听起来不像他们计划的那样)。 – krdluzni 2009-09-16 22:15:29

0

当它在DB中时,它显示为O'Connor。

所以,如果我在我的web应用程序回顾过去的名字,我将不得不使用:

$lname = stripslashes($r["lname"]); 

错!当您使用mysql_real_escape_string转义字符串时,它们只会在查询中转义。数据库解释查询,所以数据最终在数据库中没有任何转义字符。当从数据库中提取数据时,您不需要必须使用stripslashes。如果你认为你这样做了,那么这意味着数据库中的数据被破坏了。很可能是因为你开启了魔术引号。

你应该:

  • 关闭魔术引号或全球范围内改变其作用。详情请参阅the manual
  • 使用bound parameters(最佳解决方案)使用mysql_real_escape_string转义所有变量。您应该在构建查询的位置执行此操作。
  • 对于从数据库中提取的内容不做任何操作。

特别是,请不要在这里列出一些答案中列出的函数和fixinput。这是解决问题的错误方法,因为它会弄乱任何不是来自http请求的数据。

+0

只有在你不应该使用的数据上使用它。在发送到数据库之前不要使用函数来简化数据的安全性,相当于说你不应该写一个验证电话号码的函数,但应该手动放置该代码等你期待一次。或者编写任何其他功能来缩短和澄清您的代码。函数的要点是使用它应该使用的地方,而不是到处都是。如果您最终将使用该函数的数据不完整,那只意味着您已将它用于它不属于的地方。 – krdluzni 2009-07-29 17:18:34

+0

我不同意。这是一个糟糕的抽象,因为它在同一个地方做了两件完全不同的事情。解决这个问题要比用抽象的弱抽象来解决问题要好得多。它的命名也很糟糕,这意味着误用或混淆的可能性很高。 – troelskn 2009-07-29 17:55:28

+0

我承认命名可以使用一些工作,但它只能做一件事。它处理输入。您可以将它用于用户在将其发送到查询之前有机会操作的任何数据。 至于解决这个问题,这绝对是一个更好的解决方案,但是如果亲自体验了不控制主机环境带来的困难,我更愿意编写独立于此类设置的代码(即使它们是在我自己的系统上禁用)。我认为在C中写入时不使用windows-或unix-only命令/头文件/库。 – krdluzni 2009-07-29 19:06:36