如何使用此功能

时间:2012-05-07 11:12:19

标签: php function variables sql-injection

  

可能重复:   How to include a PHP variable inside a mysql insert statement

如何使用此函数清除从URL中提取的变量?假设我有$id变量,它是从“www.mydomain.com/single-page?id=534”中提取的,我想在MySQL select语句中使用之前使其变得安全。 / p>

<?php
    class SecureSqlInjection
    {
        function specificData($val)
        {
            $val = htmlspecialchars(stripslashes(trim($val)));
            $val = str_ireplace("script", "blocked", $val);
            $val = mysql_escape_string($val);
            return $val;
        }

        function secureSuperGlobalGET(&$value, $key)
        {
            if(!is_array($_GET[$key]))
            {
                $_GET[$key] = htmlspecialchars(stripslashes($_GET[$key]));
                $_GET[$key] = str_ireplace("script", "blocked", $_GET[$key]);
                $_GET[$key] = mysql_real_escape_string($_GET[$key]);
            }
            else
            {
                $c=0;
                foreach($_GET[$key] as $val)
                {
                    $_GET[$key][$c] = mysql_real_escape_string($_GET[$key][$c]);
                    $c++;
                }
            }
            return $_GET[$key];
        }

        function secureSuperGlobalPOST(&$value, $key)
        {
            if(!is_array($_POST[$key]))
            {
                $_POST[$key] = htmlspecialchars(stripslashes($_POST[$key]));
                $_POST[$key] = str_ireplace("script", "blocked", $_POST[$key]);
                $_POST[$key] = mysql_real_escape_string($_POST[$key]);
            }
            else
            {
                $c=0;
                foreach($_POST[$key] as $val)
                {
                    $_POST[$key][$c] = mysql_real_escape_string($_POST[$key][$c]);
                    $c++;
                }
            }
            return $_POST[$key];
        }

        function secureGlobals()
        {
            array_walk($_GET, array($this, 'secureSuperGlobalGET'));
            array_walk($_POST, array($this, 'secureSuperGlobalPOST'));
        }
    }
?>

3 个答案:

答案 0 :(得分:7)

为了防止SQL注入攻击,您应该在构造查询时转义从用户获得的数据,例如:

$query = "SELECT * FROM `users` WHERE `id` = '" . 
  mysql_real_escape_string($_POST['id']) . "'"; 

(注意值周围的单引号。)

更好的主意尚未使用prepared SQL statements。魔术引号无论如何都被弃用了,所以不需要stripslashes()和超级全局以及所有这些诡计。

另外,请仅在输出时使用htmlspecialchars()。现在,您实际上正在使用仍在使用的变量中的HTML实体。

答案 1 :(得分:4)

您也可以将变量转换为整数,因为您的ID只包含数字:

$id = (int)$_GET['id'];

如果传递字符串“?id = asdoi”,$ id将获得值0。

答案 2 :(得分:2)

为了保护自己免受SQL注入攻击,请始终使用预准备语句: