如何修改PHP 5.4的这个功能?

时间:2016-05-27 10:33:55

标签: php mysql pdo

我在我的网站上使用静态MySQL PDO类,这是由其他人准备好的。这个功能是检查用户输入(即用户名,消息。)

有2个问题。 首先,因为我是PDO的新手,由于我的语法错误,我很难理解这个功能,尽管我已经逐步调试了它。是的,它控制输入,但我想知道它是如何做到的?

其次我正在运行PHP 5.4并且随处阅读get_magic_quotes_gpc已被弃用。如果是这种情况,我想知道如何修改它的部分内容?

功能是:

public static function control($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") {
        $theValue = trim($theValue);
        $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;
        switch ($theType) {
            case "text":
                $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
                break;
            case "long":
            case "int":
                $theValue = ($theValue != "") ? intval($theValue) : "NULL";
                break;
            case "double":
                $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
                break;
            case "date":
                $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
                break;
            case "defined":
                $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
                break;
        }
        return $theValue;
    }

我正在使用的课程在这里上传。 sandbox.onlinephpfunctions.com

2 个答案:

答案 0 :(得分:2)

采取你的职能: -

$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

此行检查魔术引号是否已开启(它不会被激活)。如果它是打开然后它只取值,如果它关闭(现在将是它)它使用addslashes来逃避将导致问题的大多数字符。

使用php文档中的示例,如果你在字符串上使用addslashes 你的名字是O' Reilly?它会返回你的名字是O \' Reilly ?。对于基本的数据转义,这是有效的。

文本字段的功能然后执行: -

$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";

检查它是否为空。如果为空则返回NULL,否则返回带有引号的转义变量。那么你的名字是O' Reilly?变成'你的名字是O?Reilly?' 。反斜杠告诉php,以下单引号将被视为单引号的值,而不是解释为结束字符串的引用。

返回此值。只有在构建SQL字符串并执行它时,这才真正有用。

假设该值是 O' Reilly 的用户名,并且您想要检查该用户是否存在,您想要的是: -

SELECT * FROM users WHERE username = 'O\'Reilly' 

如果没有逃脱,你会有: -

SELECT * FROM users WHERE username = 'O'Reilly' 

哪会出错。这也意味着有人可以输入 fred'的用户名。 OR 1 = 1 ,因此查询总是会返回一行。这是基本的 SQL注入

Addslashes()是转义字符串的最基本方法。对于MySQL,它被mysql_escape_string()取代,并被mysql_real_escape_string()取代,每个都比以前更安全。

PDO通常用于允许参数化查询。对于这些,您可以在其中设置一个带有标记的查询,以查找您想要变量的位置。所以也许 SELECT * FROM users WHERE username =:username ,其中:username是变量的占位符。然后,将变量绑定到该占位符。因为它以这种方式作为变量传递,所以引用并不重要,因为引用是变量的一部分,而不是SQL字符串的一部分,因此理论上可以防止SQL注入。

但是,如果您在将变量绑定到SQL语句之前已经转义变量并添加了引号,那么当您想要查找 O' Reilly 时,您需要查找& #39; O \' Reilly' (带引号和反斜杠)。

因此,如果您确实正确地使用了具有绑定值的pdo,则不需要此函数。如果您只是使用pdo而不是mysql_ *函数,并构建字符串,那么仍然需要此函数,但是相当不安全。

答案 1 :(得分:-1)

对于使用PDO的poper,此功能应如下

public static function control($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = ""){
    return $theValue;
}

然后您可以使用返回值将bindValue()与PDO绑定到占位符。