2016-06-14 69 views
0

任何人都可以帮助我解决我的问题吗?使用PDO选择查询的安全性?

我目前正在将所有旧的PHP代码转换为使用PDO。 我想知道什么时候需要为我的querys使用准备功能?

我目前有这个查询。

$sql = "SELECT deckName FROM decks WHERE deleted = '0' ORDER by deckName"; 

这不是动态的,也许是删除的列。 我正在使用下面的内容重申屏幕上的数据。

foreach($DBH->query($sql) as $row){ echo $row['deckName']?> } 

我仍然应该使用这个作为良好的做法,或者是上述不够好吗?

$sth = $DBH->prepare("SELECT deckName FROM decks WHERE deleted = '0' ORDER by deckName"); 

我不太清楚如何正确使用fetch语句重复从行中的数据?提前:) 海莉

+5

[如果查询中没有变量,可以使用PDO :: query()方法。](https://phpdelusions.net/pdo#query) –

+0

当你需要绑定时使用prepare查询中的用户数据,否则您可以参考第一个示例。 –

+0

我会检查你的链接你的常识。看起来像一个很好的资源。 – HybridHaylee

回答

0

如果常量字符串发送到数据库,并就从来没有在“不受信任的输入”混合

由于安全问题是在我的经验无关,只是一个潜在的性能方面仍然存在,这取决于底层数据库。如果为执行阶段(在此准备,绑定= NOOP这里,执行)第一个之后的所有调用,可以省去昂贵的解析查询的准备步骤。

因此,从标签猜测,你使用mysql,不要使用memcached或类似的中间层,你可能只是想测量性能,否则你可以迁移到直接查询。当“项目”稍后需要查询的变量参数化(基于不受信任的输入,例如来自网络)时,应该再次使用prepare,以防止注入攻击。也许可以很好地找出“如何正确使用读取声明,当重复从行的数据”...

修改为答复,以适应在评论的查询中使用变量“uppercased nevers” :

有一个实际的原因,我写“接收不可信的输入”,而不是“从来没有这样做,从来没有”。根据我的经验,当涉及到变量时,会出现一个滑坡:在上面的问题中,如果不审计$ sql变量的更广泛的上下文 - 即使整个查询对于注入攻击来说都是潜在的无用功。 另外,从常量构建查询字符串的内部重构可能会导致混合更多变量,以组成一个充当查询的(更复杂的)字符串。

更加平衡/间隙最小化硬化我建议:

  1. 在代码文档化说“信任边界”的一个特定的地图实现一个应用程序,并此基础上,实施的任何严格的验证跨越这些边界的投入 - 即传递价值的变量 - 在大多数情况下是有效和高效的。

  2. 添加分层安全性/关注点分离的常识概念,自然会导致在“输入”(跨越边界)“注入”参数时使用预准备语句。

我不愿意伸手,简单的食谱给人安全的感觉乐观,当一个与像应用程序栈这样的scyscraper涉及基于DB Web应用程序通常会做。

+0

您建议测试哪些性能问题?一次又一次重复相同的常量查询的性能?我可以告诉你,没有任何测试,你必须只运行这个查询一次,因此没有什么可以测试的。 –

+0

说到参数化,谈论“不可信的投入”只是一个严重的错觉。一个人不应该沉思数据来源,而是无条件地使用参数。 –

+0

那么,它可能是简单的查询,为公众编辑,或者便于阅读,只有OP知道,然后很高兴知道,人们可以衡量,并决定无论如何,持续时间/延迟总是容易解释 - 安全,避免差距 - 并非如此。而不受信任的输入就是它的全部内容。如果它不在那里,好的,但容易忘记,当允许变量后面的过程中.. – Dilettant