我在我的网站上使用静态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
答案 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绑定到占位符。