Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP5.3中使用PDO(输入和输出数据)最安全的方法是什么_Php_Sql_Database_Pdo - Fatal编程技术网

在PHP5.3中使用PDO(输入和输出数据)最安全的方法是什么

在PHP5.3中使用PDO(输入和输出数据)最安全的方法是什么,php,sql,database,pdo,Php,Sql,Database,Pdo,所以最近我听说PDO实际上是不安全的,除非你确切地知道你在做什么,或者在我的情况下,复制/粘贴。不仅如此,我还不知道你不能信任自己的数据库,因为它受到了攻击。。所以,我觉得问我的问题不太合适,但我需要确保我的安全,以免为时已晚。不仅如此,我正在制作一个游戏网站,用户可以在其中保存他们的游戏,当你丢失保存游戏数据时,我们很多人都知道这真的很糟糕。以下是我的PDO连接当前的样子: $DataB = new PDO( 'mysql:dbname = dbname; host = host.host.h

所以最近我听说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 ) );
$sql   = "SELECT * FROM `names` WHERE `password` = ? AND `email` = ?";
$Fname = $DB->getOne($sql, $_COOKIE['password'], $_COOKIE['email']);
老实说,我不太确定我写的是否正确,但那只是因为我在自己制作的一个函数中有它,我需要一段时间才能解码它(下面也一样)。现在,为了更新,我一直在使用:

$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
$a=$DataB->prepare(“从`names`中选择*其中`password`=:pw和`email`=:e”);
$a->execute(数组(':pw'=>$\u COOKIE['password'],':e'=>$\u COOKIE['email']);
而($b=$a->fetch(PDO::fetch_ASSOC)){$Fname=$b['first']}
echo$Fname//
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 );

如果我不改变它,使用起来安全吗

对。在安全方面——是的。 不过,你可以保持这种特性。这两种方式都不重要

还有,当我插入数据时呢

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

$DataB->prepare(“更新
name
SET:fn,其中id=:a”)

此查询包含SQL语法错误

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

你有很长的时间。 “短”并不意味着“可读”。 可读性并不意味着“在一行中尽可能多地填充运算符”。
你使你的代码难以阅读

要使其可读,请垂直写入,而不是水平写入

要使其真正简短,请创建一个助手函数,如下所示:

$a = $DataB -> prepare( "INSERT INTO `names` (`first`,`last`) VALUES (?,?)" );
$a -> execute( array( $FirstName, $LastName ) );
$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();
一定是这样。或者至少不用花时间就能做到

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

只要您可以通过占位符将数据添加到查询中,无论数据的来源是什么,它都是完全安全的。意味着您不必信任或不信任或考虑数据来源或安全性。只要遵守规则就行了

是的,我在这个网站上读到过这篇文章,它说在PHP5.3.6之前,你无法阻止某种攻击

实际上,上面提到的ATTR_模拟功能完美地防止了这种边缘漏洞

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

尽可能使用占位符。 你不能去的地方-最好先问问这里


还有其他需要考虑的漏洞,如XSS、CSRF、文件注入等

听起来更像是一个问题,而不是一个具体的技术问题。^是的,但我不知道这个网站存在。每次我在谷歌上搜索问题,只有这个网站有答案。虽然,这两个网站的感觉是一样的。另一个看起来就像“让我们聊聊”。虽然这感觉像是“发布你的问题”。我想我会更多地浏览这个网站。Stackoverflow就像是典型编程问题的索引;如果您有特定的错误消息或常见问题,应该在Stackoverflow上提供相应的答案。你的问题更多的是一个个人化的“请让我再看一眼这个”问题,这不一定对将来来这里的人有帮助,只会堵塞系统。Codereview是专门针对这类问题制作的。事实上,它只是一个死角。你几乎找不到一个答案。你知道,有些人生活在虚拟现实中。他们孜孜不倦地发布一些法律和命令,但从来没有想到它们实际上都不起作用。其中一个问题是“此代码属于代码审查”。而你却永远得不到一个有用的答案。然而,如果我发现了你的问题,并有时间在问题解决之前写下答案,那么你就有机会了closed@YourCodereview可能没有Stackoverflow那么活跃,但是什么都没有!因此,另一方面,它充斥着各种各样的东西(双关语的部分用意)并且正在失去它的焦点。如果你不尝试执行某种结构和分类,那么它的主要目的将变得毫无用处:帮助解决每个人的常见问题。(可以说已经太晚了,为某些问题找到一个规范的、正确的答案几乎是不可能的。)关于备份数据库,我的意思是,即使只有10分钟的失利游戏数据也会让人恼火(特别是如果是minecraft的话)。关于第二个网址,这是伟大的,我至少觉得我现在大部分安全(有用)。关于语法错误,我确实提到了(我想没有那么明显)我从我自己制作的函数中获取了这些错误,看起来像这样
UPDATE$U SET$Str,其中id=:a
。while循环实际上是在一个数组中获取整个用户数据,从而
echo$User['usern