当 $_GET 只能是固定值时检查 $_GET 是不是需要额外的安全性?

Posted

技术标签:

【中文标题】当 $_GET 只能是固定值时检查 $_GET 是不是需要额外的安全性?【英文标题】:Do i need additional securuty when checking if $_GET when $_GET can be only fixed value?当 $_GET 只能是固定值时检查 $_GET 是否需要额外的安全性? 【发布时间】:2013-11-04 07:31:55 【问题描述】:

这是一个相当简单的问题,但我无法用谷歌搜索答案。

在我之前的一个问题中,我问我如何在 $_GET 值是动态的时保护自己免受注射,例如在浏览帖子并且您有 index.php?post=11 并且您需要猜测帖子 ID 时。

现在我要问如果 $_GET 值是静态的并且总是相同的安全类型是什么

我有一个类似这样的索引页面 index.php?go=upcoming 和 go=upcoming 总是一样的。因此,与其猜测这里我有静态值,而且我有一个代码来检查它并查看是否即将发布的值来显示其余代码。

我在这里添加了一个完整的代码,用于查询其余代码的功能,例如我没有添加的 html 格式。太长了。

if(isset($_GET['go']) && $_GET['go'] == 'upcoming' )
    mysqli_query($conn, " SELECT * FROM deals WHERE upcoming=1");

else 
    mysqli_query($conn, "SELECT * FROM deals WHERE active=1");

我是否需要担心这个 sql 注入和/或其他黑客和安全问题?

【问题讨论】:

是什么阻止了用户在地址栏中输入 URL,而不是从索引页面链接? “注射” 什么? HTML、SQL、无效参数? 只有当您将客户端提供的值替换为 SQL 语句、HTML 页面或其他一些活动数据时,注入才是一个问题。如果您只是在 PHP if 语句中使用该值,则注入不是问题。 @Frits van Campen sql 注入,因为即将到来的交易()函数连接到数据库以提取即将发生的交易的数据。 【参考方案1】:

是的,你需要。永远不要相信来自用户的任何东西。没有人可以在这里做 SQL 注入,因为没有 SQL,但也许他可以做一些你还没有看到的事情。

始终验证用户输入,这并不难,但可以节省您的软件并节省大量时间。最简单的方法是:

$var = htmlspecialchars(filter_var($_GET['i']));

【讨论】:

【参考方案2】:

如果此变量只是在程序逻辑中使用但在数据操作中没有使用的标志(即仅在if 语句中使用) - 当然,不需要清理。

至于涉及到任何数据操作的数据,无论是存储、交换还是输出 - 它必须不经过清理,而是格式化 - 根据目标介质的规则。比如说,html 格式对于 SQL 或 JSON 等完全没用。

【讨论】:

【参考方案3】:

由于您没有将用户输入插入到您的 SQL 语句中,因此您不必担心这里的 SQL 注入。

【讨论】:

以上是关于当 $_GET 只能是固定值时检查 $_GET 是不是需要额外的安全性?的主要内容,如果未能解决你的问题,请参考以下文章

PHP中的__get()和__set()方法获取设置私有属性

巧用PHP中__get()魔术方法

PHP魔术法__set和__get

$_GET $_POST $_REQUEST

PHP $_GET与$_POST

使用 3 个 $_GET 值