首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你还需要数据库安全吗?

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

Stack Overflow用户
提问于 2013-04-13 10:38:22
回答 2查看 143关注 0票数 4

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-13 13:18:13

肯定是这样的。

事实上,本机预准备语句只适用于简单的教科书案例。

这意味着对于任何复杂的情况,您仍然需要编写一些“数百行”。我在PDO tag wiki中对这种情况做了一个小小的总结。主要缺点是

  • 没有标识符的占位符。你必须像在老的好的mysql_*代码中那样手动格式化和注入它们。
  • 没有数组的占位符。这意味着您仍然需要手动编写一些代码,然后将其注入到查询中-因此,仍然有可能陷入一些麻烦。

因此,即使在PDO上,您也需要更高级别的抽象。一种常见的解决方案是使用由每个现代框架提供的某种类型的查询生成器。

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

意思是使用safeMysql you 确实可以“按字面意思写查询”:

代码语言:javascript
复制
$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);

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

票数 2
EN

Stack Overflow用户

发布于 2013-04-13 12:21:48

我认为对于"sql注入攻击“,答案几乎是肯定的。mysqli prepared statements and mysqli_real_escape_string

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

依赖PDO来“修复”您的安全性就像依赖编译器来查找错误一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15983616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档