相关疑难解决方法(0)

围绕mysql_real_escape_string()的SQL注入

即使使用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代码注入的注入吗?

php mysql sql security sql-injection

596
推荐指数
4
解决办法
22万
查看次数

如何使用PDO从MySQL获取数值类型?

我正在使用PDO和MySQL,出于某种原因,当从数据库获取int类型的值时,PDOStatement返回数字的字符串表示而不是数字类型的值.我该如何防止这种情况发生?

我注意到有一个PDO类的属性:PDO::ATTR_STRINGIFY_FETCHES应该处理这个,但是,当试图修改它时,它会抛出一个错误,说该属性对MySQL驱动程序无效.

在咨询数据库时获取字符串而不是数字是否正常?

php mysql pdo

61
推荐指数
4
解决办法
3万
查看次数

释放PDO预处理语句(DEALLOCATE PREPARE)

PDO准备好的陈述应该在使用后释放吗?如果是这样,怎么样?具体来说,我问的是MySQL - 你怎么能,也应该DEALLOCATE PREPARE通过PDO 打电话.(编辑:澄清一下,这个问题并不是指仿效准备,而是真正的准备.)

此外 - 这会释放结果集(大时)吗?

说明:

我已经看到了代码

$stmnt = $db->prepare($sql);
$stmnt->execute($aParams);
$stmnt = null;
Run Code Online (Sandbox Code Playgroud)

这让我想知道这是做什么的,何时,如果f unset($stmnt);会有所不同?

手册表明

准备好查询后,数据库将分析,编译和优化其执行查询的计划.[...]通过使用预准备语句,应用程序避免重复分析/编译/优化循环.

这往往表明你应该取消分配语句,MySQL有能力.所以,

  1. 你可以打电话DEALLOCATE PREPARE,怎么打电话
  2. 你应该这样做吗?
  3. 并且任何人都可以确认设置语句为null(或取消设置语句)将与mysql_和mysqli_的"free_result"相同吗?
  4. 它会立即发生,还是等待垃圾收集器启动?

为了完整性,另一个提到"free_result"和"close"函数的SO问题mysqli_()表明释放语句实际上增加了时间(除非你有大量的内存使用并需要空间).但是"free_result"不同于释放SQL服务器而不是缓存准备好的语句.

php mysql pdo prepared-statement

11
推荐指数
1
解决办法
2967
查看次数

默认为模拟的 PDO 准备语句

我已经多次读到,默认情况下,PDO 不使用本机准备好的语句,而是更喜欢模拟它们。要启用真正的准备好的语句,您可以添加:

\n\n
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);\n
Run 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

PDO 将为本身不支持它们的驱动程序模拟准备好的语句/绑定参数,并且如果驱动程序支持一种样式但不支持另一种样式,还可以将命名或问号样式参数标记重写为更合适的内容。

\n
\n\n

http://www.php.net/manual/en/ref.pdo-mysql.php它说:

\n\n
\n

PDO_MYSQL 将利用 MySQL 4.1 及更高版本中提供的本机预准备语句支持。如果您使用旧版本的 mysql 客户端库,PDO 将为您模拟它们。

\n
\n\n

就我个人而言,我更喜欢使用真正的准备好的语句,这样 \xe2\x80\x99s 就很容易修复,尤其是在数据库支持相当好的 2017 年。

\n\n

问题是:PDO 默认为模拟准备的记录在哪里?另外,这适用于所有数据库还是某些数据库?

\n\n

注意:存在一个问题:默认情况下 PDO 总是使用模拟的准备好的语句吗?。这不是重复的(我已经读过):

\n\n
    \n
  • 这个问题已经5年了
  • \n
  • 链接已失效
  • \n
  • 评论中有一些不同意见。
  • \n
\n\n

这个问题并没有告诉我这实际上记录在哪里。

\n

php pdo prepared-statement

6
推荐指数
0
解决办法
374
查看次数

标签 统计

php ×4

mysql ×3

pdo ×3

prepared-statement ×2

security ×1

sql ×1

sql-injection ×1