在HTML中显示一小部分SQL查询是否安全?

时间:2018-05-15 09:20:34

标签: php sql

假设我有一个销售乐器的网站。我正在使用PHP和MySQL来动态构建标记为products.php的产品页面。

现在我的表有多个列,例如ParentCategory等。按products标签会转到category.php,您可以在其中按下一些分类按钮,这会将您带到products.php并仅显示相关产品。< / p>

现在,这里解决了这个问题。要从数据库中检索项目,我们需要设置类似

的查询

SELECT * FROM productlist WHERE ParentCategory=1

在类别页面中,按钮以表单形式包装,每个按钮使用 query 提交名为POST的变量。该值类似于ParentCategory=1

隐藏了带有tablename的完整SQL查询,但是按钮必须提交的多个子查询(例如ParentCategory=1ParentCategory=2)显示在页面本身的HTML中。< / p>

我想知道的是,这是一个巨大的安全漏洞?如同,恶意用户是否可以利用此类信息进行黑客攻击?就个人而言,我想不出用户在知道其列名后才能利用该网站的方式,但我也只是开始进行网站开发。

如果是这种情况,那么这些查询传递的最安全或最通用的方法是什么?我会想到GET但是这会延长URL并打开注入问题,因为任何值都可以传递。

3 个答案:

答案 0 :(得分:4)

  

这是一个巨大的安全漏洞

不是在客户端显示 SQL,而是 来自浏览器的SQL并在您的服务器上执行它。根据定义,这是SQL注入。浏览器并不仅限于您在HTML中添加的SQL代码段;浏览器(读取:任何HTTP客户端)可以将任何自由格式的SQL发送回您的服务器。如果您的服务器只是从任意客户端执行任何给定的SQL,那么您已经死了。

获取一些已定义的参数并将其转换为SQL。 E.g:

if ($_GET['order'] == 'product') {
    $sql .= 'ORDER BY products.id';
}

答案 1 :(得分:1)

如果您计划将表单中的文本直接粘贴到“where”子句的末尾,那对我来说这似乎是一个坏主意。如果您正在进行POST,并将某个表单值设置为“ParentCategory = 1”,则可以通过POST轻松地通过GET进行SQL注入(有关详细信息,请参阅Is SQL Injection possible with POST?)。

更好的方法是这样的:

  1. 您的用户从列表中选择父类别。
  2. 您的表单通过get / post参数(“ParentCategory = 2”或“ParentCategory = Dog Walking”等)发回类别。
  3. 您的PHP代码构造一个查询,将您的表单参数映射到数据库列的名称:

    SELECT * FROM productlist WHERE parent_category = 2

  4. 将用PHP构建的查询发送到数据库。

答案 2 :(得分:-1)

首先要明确的是,你所谓的“sql查询的一小部分”称为http查询字符串,它通过GET请求传递,并通过$_GET数组在PHP中提供,所以它不是技术上是SQL查询的一部分,直到将其传递给SQL查询。

要回答你的问题, - 如果你清理变量是安全的,对于PHP你必须使用mysqli_real_escape_string函数,看看这里 https://secure.php.net/manual/en/mysqli.real-escape-string.php

如果必须使用PDO,则使用PDO::prepare自动引用变量内容以防止SQL注入。 https://secure.php.net/manual/en/pdo.prepare.php