0

所以最近我听说 PDO 实际上并不安全,除非你确切地知道你在做什么,或者在我的情况下,复制/粘贴。不仅如此,我不知道你也不能相信自己的数据库受到攻击。好吧,问我在问什么感觉不太对,但我需要确保我是在为时已晚之前安全。不仅如此,我正在制作一个游戏网站,用户可以在其中保存他们的游戏,当你丢失保存的游戏数据时,我们很多人都知道这真的很糟糕。这是我的 PDO 连接当前的样子:

$DataB = new PDO( 'mysql:dbname = dbname; host = host.host.host; charset = utf8', 'username', 'password' );
$DataB -> setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
$DataB -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

老实说,我所知道的是它是 PDO,并且有效。如果我不更改它,使用它是否非常安全?另外,当我插入数据时呢?嗯,像这样:

$a = $DataB -> prepare( "INSERT INTO `names` (`first`,`last`) VALUES (?,?)" );
$a -> execute( array( $FirstName, $LastName ) );

现在说实话,我不太确定我是否正确地写了那个,但这只是因为我在我制作的个人功能中拥有它,而且我需要一段时间才能解码它(下面也一样)。现在更新,我一直在使用这个:

$DataB -> prepare( "UPDATE `names` SET :fn WHERE id = :a" ) -> execute( array( ':a' => $IDnumber, ':fn' => $NewFname ) );

这是一样的,但它在一条线上工作。我不确定这是否重要,但我不是天才。但如果可能,我总是更喜欢较短的代码。现在我选择一个:

$a = $DataB -> prepare( "SELECT * FROM `names` WHERE `password` = :pw AND `email` = :e " );
$a -> execute( array( ':pw' => $_COOKIE['password'], ':e' => $_COOKIE['email'] ) );
while ( $b = $a -> fetch( PDO::FETCH_ASSOC ) ) { $Fname = $b['first'] }
echo $Fname;//<-filtered html in real life

这让我想知道我拥有的 PDO 是否缺少任何过滤器,因为我听说我也不能信任自己的数据库。现在,这几乎是我的数据库用户的东西,没有任何额外的缺失(嗯,没有什么重要的缺失)。是的,我在这个网站上读过这篇文章,有点说在 PHP 5.3.6 之前你无法阻止某种攻击,但我的网站只有 PHP 5.3.0。或者,这就是我刚才问的一个活生生的人所说的。但是,我仍然不确定我如何使用我的数据库是否是正确的使用方法。因为当我插入、更新和选择/其他用户制作的数据时,谁知道它是什么样子的。

长话短说,我需要确保它在 PHP 5.3.0 中有效。并且不会用随机用户制作的数据搞砸任何重要的事情。

4

1 回答 1

2

除非您确切知道自己在做什么,否则 PDO 实际上并不安全,

这是正确的。但是,不仅适用于 PDO

当您丢失保存游戏数据时,我们很多人都知道这真的很糟糕。

备份它。

这是我的 PDO 连接当前的样子:

这是它的样子

如果我不更改它,使用它是否非常安全?

是的。在安全方面 - 是的。不过,您可以保留 ATTR_EMULATE 的东西。无论哪种方式都没有太大关系。

另外,当我插入数据时呢?

只要您可以通过占位符将数据添加到查询中,就绝对安全。
麻烦从不能使用占位符的地方开始。以字段名称为例。在上面的链接中,您可以找到解决方案。

$DataB -> 准备(“更新names集:fn WHERE id = :a”)

此查询包含 SQL 语法错误。

如果可能,我总是更喜欢较短的代码。

你有它其实很长。“短”并不意味着“可读”。可读并不意味着“在一行中包含尽可能多的运算符”。
你让你的代码难以阅读。

为了使其可读,垂直书写,而不是水平书写。

为了使其真正简短,请创建一个要像这样使用的辅助函数:

$sql   = "SELECT * FROM `names` WHERE `password` = ? AND `email` = ?";
$Fname = $DB->getOne($sql, $_COOKIE['password'], $_COOKIE['email']);

看 -它既短又易读。不是吗?

而 ( $b = $a -> fetch( PDO::FETCH_ASSOC ) ) { $Fname = $b['first'] }

手册是你的朋友

$Fname = $a->fetchColumn();

它必须是。或者至少很快就能做到。

因为我听说我也不能相信我自己的数据库。

只要您可以通过占位符将数据添加到查询中,无论其来源如何,它都是绝对安全的。意味着您根本不必信任或不信任或考虑数据源或安全性。只要遵守规则。

是的,我在这个网站上读过这篇文章,有点说在 PHP 5.3.6 之前你无法阻止某种攻击

实际上,上面提到的这个 ATTR_EMULATE 东西完美地防止了这个边缘漏洞。

因为当我插入、更新和选择/其他用户制作的数据时,谁知道它是什么样子的。

尽可能使用占位符。你不能 - 最好先在这里问。

还有其他漏洞需要考虑——比如 XSS、CSRF、文件注入等等。

于 2013-04-17T08:53:50.223 回答