2010-03-31 90 views
2

我得到这个从登录表单教程说明:这个SQL消毒代码

function sanitize($securitystring) { 
     $securitystring = @trim($str); 
     if(get_magic_quotes_gpc()) { 
      $securitystring = stripslashes($str); 
     } 
     return mysql_real_escape_string($securitystring); 
    } 

能有一个人正是这样做解释?我知道后来调用'干净'变种来清理田地;即$email = sanitize($_POST['email']);

回答

2

首先,这段代码是错误的。
它有错误的意思和错误的名称。

没有SQL数据准备代码进行任何清理或消毒。 它只是逃避。而这种逃避必须是无条件的。 和逃逸不应该混入其他任何东西。

所以,它必须是三个分开的功能,而不是一个。

  1. 摆脱魔术引号。必须在数据输入处单独完成。
  2. 如果你愿意修剪。这只是文本美化,没有关键功能。
  3. mysql_real_escape_string()为SQL查询准备数据。

所以,这里唯一与mysql有关的函数是mysql_real_escape_string()。尽管它没有提供任何数据“干净”,但仅仅是避开了分隔符。因此,必须使用此功能只有与数据被视为一个字符串,并用引号括起来。所以,这是一个很好的例子:

$num=6; 
$string='name'; 
$num=mysql_real_escape_string($num); 
$string=mysql_real_escape_string($string); 
$query="SELECT * FROM table WHERE name='$name' AND num='$num'"; 

而这个例子是错误的:

$num=6; 
$string='name'; 
$num=mysql_real_escape_string($num); 
$string=mysql_real_escape_string($string); 
$query2="SELECT * FROM table WHERE name='$name' AND num=$num"; 

即使$ QUERY2不会抛出一个语法错误,这是错误的数据准备和mysql_real_escape_string将帮助这里没有什么。所以,这个函数只能用于转义被视为字符串的数据。尽管可以对任何数据类型进行操作,但也有一些例外,例如LIMIT参数,不能将其视为字符串。

6

基本上,如果你有魔术引号开启时,在POST /会话数据的特殊字符会自动进行转义(同应用和addslashes ()到字符串)。 MySQL转义函数比PHP的addslashes()更好(尽管我不记得确切的原因)。

你的代码的作用是检查php.ini文件是否启用了魔术引号,如果是这样,斜线从数据中除去,然后使用MySQL函数重新清理。如果魔术引号没有打开,则不需要去除斜线,因此数据只需使用MySQL函数进行消毒并返回即可。

+1

@Moonshield,MAGIC QUOTES功能已被弃用,所以我们不应该依赖它。另外,如你所说,MySQL功能更好。 MySQL转义函数转义所有MySQL特定的特殊字符。 MAGIC QUOTES只会引用引号,反斜杠和空字符。 – 2010-03-31 13:27:52

+0

有一些奇怪的情况,在SO上广泛宣传,当addslashes会失败并出现一些罕见的数据集时。 – 2010-03-31 13:57:16

0

mysql_real_escape_string用于转义字符串中的字符以将反斜杠添加到字符,如',这可防止攻击者将其他SQL语句嵌入到字符串中。如果字符串未被转义,则可以附加额外的SQL。例如,可能会执行以下内容:

SELECT * FROM tbl WHERE col ='test'; DELETE * FROM tbl; SELECT'拥有'

magic_quotes确实转义了它自己,虽然如果我没记错的话现在它的使用已经不受欢迎了。此外,MySQL函数将完成所有需要防止SQL注入攻击的转义。

+0

如果数据没有被转义**并且没有用引号**括起来,可以附加额外的SQL。每个人都会忘记这部分 – 2010-03-31 13:35:54

0

一些(旧)服务器已启用magic_quotes。这意味着所有的外部输入都被修改为(假定)将其转义以便在MySQL查询中注入。所以O'Brian变成O\'Brian。这是由PHP团队的早期设计的决定,证明是错误的:

  • 你并不总是需要注入输入到数据库查询
  • 并不是所有DB引擎使用反斜杠作为转义字符
  • 逃逸单与背部斜线的报价是不够的,即使对MySQL
  • 你的服务器的安全性依赖于可被禁用

一个PHP设定所以这是没有办法magic_quotes的更好的代码。问题出现在可重新分发的代码中:您无法知道服务器是否启用或禁用了magic_quotes。因此,您可以使用get_magic_quotes_gpc()来检测它们是否处于开启状态,如果是,则使用stripslashes()来(尝试)恢复原始输入。