所以最近我听说 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 中有效。并且不会用随机用户制作的数据搞砸任何重要的事情。