即使使用mysql_real_escape_string()函数,是否存在SQL注入的可能性?
考虑这个示例情况.SQL是用PHP构造的,如下所示:
$login = mysql_real_escape_string(GetFromPost('login'));
$password = mysql_real_escape_string(GetFromPost('password'));
$sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";
Run Code Online (Sandbox Code Playgroud)
我听过很多人对我说,这样的代码仍然很危险,即使使用了mysql_real_escape_string()函数也可以破解.但我想不出任何可能的漏洞?
像这样的经典注射:
aaa' OR 1=1 --
Run Code Online (Sandbox Code Playgroud)
不工作.
你知道任何可能通过上面的PHP代码注入的注入吗?
我正在使用PDO和MySQL,出于某种原因,当从数据库获取int类型的值时,PDOStatement返回数字的字符串表示而不是数字类型的值.我该如何防止这种情况发生?
我注意到有一个PDO类的属性:PDO::ATTR_STRINGIFY_FETCHES应该处理这个,但是,当试图修改它时,它会抛出一个错误,说该属性对MySQL驱动程序无效.
在咨询数据库时获取字符串而不是数字是否正常?
PDO准备好的陈述应该在使用后释放吗?如果是这样,怎么样?具体来说,我问的是MySQL - 你怎么能,也应该DEALLOCATE PREPARE通过PDO 打电话.(编辑:澄清一下,这个问题并不是指仿效准备,而是真正的准备.)
此外 - 这会释放结果集(大时)吗?
说明:
我已经看到了代码
$stmnt = $db->prepare($sql);
$stmnt->execute($aParams);
$stmnt = null;
Run Code Online (Sandbox Code Playgroud)
这让我想知道这是做什么的,何时,如果f unset($stmnt);会有所不同?
手册表明
准备好查询后,数据库将分析,编译和优化其执行查询的计划.[...]通过使用预准备语句,应用程序避免重复分析/编译/优化循环.
这往往表明你应该取消分配语句,MySQL有能力.所以,
DEALLOCATE PREPARE,怎么打电话为了完整性,另一个提到"free_result"和"close"函数的SO问题mysqli_()表明释放语句实际上增加了时间(除非你有大量的内存使用并需要空间).但是"free_result"不同于释放SQL服务器而不是缓存准备好的语句.
我已经多次读到,默认情况下,PDO 不使用本机准备好的语句,而是更喜欢模拟它们。要启用真正的准备好的语句,您可以添加:
\n\n$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);\nRun Code Online (Sandbox Code Playgroud)\n\n我还读到 MySQL 是这样,但 PostgreSQL 不是这样。
\n\n我真正希望阅读的一个地方是 PHP\xe2\x80\x99s 网站,但我发现根本没有提及它。
\n\n我能找到的最接近的是来自http://php.net/manual/en/pdo.prepare.php:
\n\n\n\n\nPDO 将为本身不支持它们的驱动程序模拟准备好的语句/绑定参数,并且如果驱动程序支持一种样式但不支持另一种样式,还可以将命名或问号样式参数标记重写为更合适的内容。
\n
在http://www.php.net/manual/en/ref.pdo-mysql.php它说:
\n\n\n\n\nPDO_MYSQL 将利用 MySQL 4.1 及更高版本中提供的本机预准备语句支持。如果您使用旧版本的 mysql 客户端库,PDO 将为您模拟它们。
\n
就我个人而言,我更喜欢使用真正的准备好的语句,这样 \xe2\x80\x99s 就很容易修复,尤其是在数据库支持相当好的 2017 年。
\n\n问题是:PDO 默认为模拟准备的记录在哪里?另外,这适用于所有数据库还是某些数据库?
\n\n注意:存在一个问题:默认情况下 PDO 总是使用模拟的准备好的语句吗?。这不是重复的(我已经读过):
\n\n这个问题并没有告诉我这实际上记录在哪里。
\n