Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.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
Php 你还需要数据库安全吗?_Php_Mysql_Pdo - Fatal编程技术网

Php 你还需要数据库安全吗?

Php 你还需要数据库安全吗?,php,mysql,pdo,Php,Mysql,Pdo,这是一个针对PDO准备的语句的安全问题。使用PDO,我知道sql注入的风险实际上是不可能的,并且该类可以为您处理所有这些。使用mysql_*stack之后,我总觉得自己在处理安全问题方面做得不够好。我通常习惯于编写数百行代码来处理安全问题,而现在我实际上只是编写查询 除了数据库中字符串的长度之外,PDO语句是否真的存在任何我必须担心的安全威胁?对于“sql注入攻击”,我认为答案几乎是肯定的。 还有许多其他类型的攻击,但至少您的所有值都被转义 依靠PDO“修复”您的安全就像依靠编译器查找您的bu

这是一个针对PDO准备的语句的安全问题。使用PDO,我知道sql注入的风险实际上是不可能的,并且该类可以为您处理所有这些。使用mysql_*stack之后,我总觉得自己在处理安全问题方面做得不够好。我通常习惯于编写数百行代码来处理安全问题,而现在我实际上只是编写查询


除了数据库中字符串的长度之外,PDO语句是否真的存在任何我必须担心的安全威胁?

对于“sql注入攻击”,我认为答案几乎是肯定的。

还有许多其他类型的攻击,但至少您的所有值都被转义


依靠PDO“修复”您的安全就像依靠编译器查找您的bug一样。

肯定是。

事实上,母语编写的陈述仅适用于简单的教科书案例。
这意味着你仍然需要为任何复杂的情况写上“数百行”。我在报纸上对这些案件做了一个小摘要。主要缺点是

  • 标识符没有占位符。您必须像旧的好mysql代码一样手动格式化和注入它们
  • 数组没有占位符。这意味着您仍然需要手动编写一些代码,然后将其注入查询中——因此,仍然有可能陷入一些麻烦
因此,即使在PDO上,您也需要更高级别的抽象。一个常见的解决方案是使用各种现代框架提供的某种查询生成器

但就我个人而言,我讨厌查询生成器,因为它们在我看来过于臃肿,假装要替换整个SQL,但显然失败了。所以,当我可以使用纯SQL时,我不明白为什么要使用PHP编写的SQL。为此,我创建了一个抽象库,以纠正原生语句的所有缺点。它为您需要的所有内容提供了占位符,从而使查询比PDO安全得多,但它使应用程序代码大大缩短

意味着使用safeMysql,您确实可以“直接编写查询”:


只需将这些2行程序与您需要使用原始PDO编写的代码量进行比较。

这有点像是在问“在编程中我需要关注哪些安全问题?”可能太宽泛了。看看这个答案,实际上我认为这是一个定义相当明确的问题,基本上,“POD不能自动防范哪些安全威胁“我喜欢,里面没有100%安全的东西。PDO只是另一道防线。在将输入传递到查询之前,您仍然应该验证它们……PDO只是保护您不受SQL相关内容的影响。web上还有许多其他安全风险,从简单的Javascript注入到更“奇特”的问题,如与字符编码有关的XSS攻击。这些事情大部分都是通过你准备好的陈述来完成的。
$sql  = "SELECT * FROM articles WHERE id IN(?a) ORDER BY ?n LIMIT ?i"
$data = $db->getAll($sql, $ids,$_GET['order'], $limit);

$sql  = "INSERT INTO stats SET pid=?i,ip=inet_aton(?s),?u ON DUPLICATE KEY UPDATE ?u";
$db->query($sql, $pid, $ip, $data, $data);