如何在 PHP 中处理 FluentPDO 的安全问题?

Posted

技术标签:

【中文标题】如何在 PHP 中处理 FluentPDO 的安全问题?【英文标题】:How to handle security issues with FluentPDO in PHP? 【发布时间】:2016-04-14 07:31:58 【问题描述】:

我正在使用 FluentPDO 处理我的数据库查询。 在查看它的代码时,它似乎没有使用任何形式的转义。我知道 PDO 本身可以解决很多安全问题,但它也不能幸免于难。

据我了解,只要我们使用它主页上的预处理语句语法,它就不会受到 SQL 注入的影响:

$query = $fpdo->from('article')
        ->where('published_at > ?', $date) // HERE!!
        ->orderBy('published_at DESC')
        ->limit(5);

如何转义变量以防止二阶 SQL 注入?简单地使用addslashes() 就足够了吗?会不会是多余的? 我应该如何处理这个库的安全性?

谢谢!

【问题讨论】:

如果库使用prepared statement并绑定参数。应该没问题。 不要区分数据的来源;只需将它作为参数传递就可以了。 对不起@Gumbo,请您进一步解释一下吗? @fgarci03 有人认为所谓的“二阶 SQL 注入”是一种特殊情况,因为数据来自“受信任的来源”或他们拥有的任何站不住脚的论据。但是,这只是一种特殊情况,前提是您首先处理来自数据库的数据与来自任何其他来源的数据不同。但是任何 SQL 注入都只是 SQL 注入,与数据的来源无关。 SQL 注入不是信任问题,而是数据处理不当。因此,只需担心数据来自哪里,只需将其作为参数传递给您的数据库,以确保它按预期进行处理,即。例如,作为数据。 我现在明白了。是的,我以同样的方式处理所有数据,无论它来自哪里!谢谢 【参考方案1】:

关于消毒,read more。

一些不错的报价:

不要试图通过清理输入数据来防止 SQL 注入。

相反,请勿在创建 SQL 代码时使用数据。使用使用绑定变量的准备好的语句(即在模板查询中使用参数)。这是唯一能保证不会发生 SQL 注入的方法。

或者(阅读更多关于validating filters)

php 现在有了新的不错的 filter_input 函数,例如,现在有一个内置的 FILTER_VALIDATE_EMAIL 类型,可以让您从寻找“终极电子邮件正则表达式”中解放出来

【讨论】:

请注意,验证(如使用 FILTER_VALIDATE_EMAIL 所示)不会使正确的数据处理(例如,准备好的语句使用的参数化)过时。有关详细示例,请参阅 Does FILTER_VALIDATE_EMAIL make a string safe for insertion in database? 和 Is FILTER_VALIDATE_EMAIL sufficient to stop shell injection?。

以上是关于如何在 PHP 中处理 FluentPDO 的安全问题?的主要内容,如果未能解决你的问题,请参考以下文章

php中如何对提交表单地址栏参数进行加密或者隐藏,或者其他安全性的处理

PHP 处理接口保证数据安全性

如何在将文件包含在 PHP 中之前安全地评估文件的内容

PHP面试题精讲—从Yii2源码ActiveForm看如何安全处理表单验证

PHP面试题精讲—从Yii2源码ActiveForm看如何安全处理表单验证

PHP 登录和处理会话安全