在PHP 5.3中使用PDO(传输和传出数据)的最安全的方法是什么

时间:2013-04-17 05:50:11

标签: php sql database pdo

所以最近我听说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是否有任何过滤器,因为我听说我也不相信自己的数据库。现在,这几乎是我的数据库用户的东西,没有任何额外的缺失(好吧,没有什么重要的缺失)。是的,我已经读过这个on this website哪种说你无法在PHP 5.3.6之前阻止某种攻击,但我的网站只有PHP 5.3.0。或者,这就是我刚问过的活人。但是,我仍然不确定我是如何使用我的数据库甚至是使用它的正确方法。当我在何时知道它的外观时插入,更新和选择/其他用户制作的数据。

长话短说,我需要确保这在PHP 5.3.0中有效。并且不会弄乱任何重要的随机用户数据。

1 个答案:

答案 0 :(得分:2)

  

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

没错。但是Not only for PDO

  

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

备份它。

  

以下是我目前的PDO连接:

Here is how it should be looking like

  

如果我不改变它,这是否安全使用?

是肯定的。在安全方面 - 是的。 你可以保留ATTR_EMULATE的东西。无论如何都无关紧要。

  

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

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

  

$ DataB - &gt; prepare(“UPDATE names SET:fn WHERE id =:a”)

此查询包含SQL语法错误。

  

我总是喜欢更短的代码。

你实际上有。 “短”并不意味着“可读”。 可读并不意味着“尽可能多的操作员在一条线上” 你的代码难以阅读。

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

要使真实简短,请创建一个帮助函数,如下所示:

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

看 - 它简短且可读。不是吗?

  

while($ b = $ a - &gt; fetch(PDO :: FETCH_ASSOC)){$ Fname = $ b ['first']}

手册是你的朋友

$Fname = $a->fetchColumn();
它必须是。或者至少在没有的时候成功。

  

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

只要您可以通过占位符在查询中添加数据,无论其来源是什么,都非常安全。意味着您不必信任或不信任或思考数据源或安全性。只要遵守规则。

  

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

实际上,上面提到的这个ATTR_EMULATE事情可以完美地防止这个边际漏洞。

  

当我知道它的外观时,我插入,更新和选择/其他用户制作的数据。

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

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