此SQL清理代码的说明

时间:2010-03-31 13:13:13

标签: php sql code-injection

我从登录表单教程中得到了这个:

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

有人可以准确解释这是做什么的吗?我知道之后会打电话给'干净'的var来消毒田地;即$email = sanitize($_POST['email']);

5 个答案:

答案 0 :(得分:6)

基本上,如果您启用了魔术引号,POST / SESSION数据中的特殊字符将自动转义(与将addslashes()应用于字符串相同)。 MySQL转义函数比PHP的addslashes()好(虽然我不记得确切的原因)。

您的代码所做的是检查php.ini文件是否启用了魔术引号,如果是,则从数据中删除斜杠,然后使用MySQL函数对其进行重新清理。如果未启用魔术引号,则无需删除斜杠,因此只需使用MySQL函数对数据进行清理并返回。

答案 1 :(得分:2)

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

没有SQL数据准备代码进行任何清理或清理。 它只是逃避。这种逃避必须是无条件的。 逃避不应与其他任何东西混在一起。

所以,它必须是三个独立的函数,而不是一个。

  1. 摆脱魔法引号。必须在数据输入处单独完成。
  2. 如果你愿意的话,
  3. 修剪。它只是文本美化,没有关键功能。
  4. mysql_real_escape_string()为SQL查询准备数据。
  5. 所以,这里唯一的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参数,不能将其视为字符串。

答案 2 :(得分:0)

trim()删除所有空格,如果启用了魔术引号,则会从stripslashes()的任何转义引号中删除反斜杠。 mysql_real_escape_string()准备好安全地在mysql查询中使用的字符串。

以下是所用功能的文档:http://php.net/manual/en/function.trim.phphttp://php.net/manual/en/function.get-magic-quotes-gpc.phphttp://php.net/manual/en/function.stripslashes.phphttp://php.net/manual/en/function.mysql-real-escape-string.php

答案 3 :(得分:0)

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

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

magic_quotes确实逃脱了自己,但如果我没记错的话,现在不鼓励使用它。此外,MySQL函数将完成防止SQL注入攻击所需的所有转义。

答案 4 :(得分:0)

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

  • 您并不总是需要将输入注入数据库查询
  • 并非所有数据库引擎都使用反斜杠作为转义字符
  • 使用反斜杠转义单引号是不够的,即使对于MySQL
  • 也是如此
  • 您的服务器安全性依赖于可以禁用的PHP设置

所以在没有magic_quotes的情况下进行编码会更好。问题来自可再发行代码:您无法知道服务器是否启用或禁用magic_quotes。因此,您可以使用get_magic_quotes_gpc()来检测它们是否已打开,如果是,请使用stripslashes()来(尝试)恢复原始输入。