Php 用HTML显示SQL查询的一小部分是否安全?

Php 用HTML显示SQL查询的一小部分是否安全?,php,sql,Php,Sql,假设我有一个卖乐器的网站。我使用PHP和MySQL动态构建标签为products.PHP的产品页面 现在,我的表有多个列,例如ParentCategory等等。按下products选项卡将带您进入category.php,在那里您可以按下一些分类按钮,这将带您进入products.php,并仅显示相关的产品 现在,问题来了。要从数据库中检索项目,我们需要设置如下查询 从产品列表中选择*,其中ParentCategory=1 从类别页面,按钮被包装成一个表单,每个按钮使用POST提交一个名为que

假设我有一个卖乐器的网站。我使用PHP和MySQL动态构建标签为
products.PHP
的产品页面

现在,我的表有多个列,例如
ParentCategory
等等。按下
products
选项卡将带您进入
category.php
,在那里您可以按下一些分类按钮,这将带您进入
products.php
,并仅显示相关的产品

现在,问题来了。要从数据库中检索项目,我们需要设置如下查询

从产品列表中选择*,其中ParentCategory=1

从类别页面,按钮被包装成一个表单,每个按钮使用
POST
提交一个名为
query
的变量。该值类似于
ParentCategory=1

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

我想知道的是,这是一个巨大的安全漏洞吗?如中所述,恶意用户是否可以利用这些信息进行黑客攻击?就我个人而言,我想不出一个用户在只知道网站的列名后就可以利用该网站的方法,但我也只是从web开发开始

如果是这样,那么传递这些查询最安全或通用的方式是什么?我本以为
GET
,但这会延长URL的长度,并引发注入问题,因为任何值都可以传递

这是一个巨大的安全漏洞吗

是。

这不是在客户端显示SQL,而是从浏览器中按原样获取SQL并在服务器上执行。根据定义,这就是SQL注入。浏览器实际上并不局限于放入HTML中的SQL代码段;浏览器(读取:任何HTTP客户端)可以将任何自由形式的SQL发送回服务器。如果您的服务器只是从任意客户端执行任何给定的SQL,那么您就死定了

获取一些已定义的参数并将其转换为SQL。例如:

if ($_GET['order'] == 'product') {
    $sql .= 'ORDER BY products.id';
}
这是一个巨大的安全漏洞吗

是。

这不是在客户端显示SQL,而是从浏览器中按原样获取SQL并在服务器上执行。根据定义,这就是SQL注入。浏览器实际上并不局限于放入HTML中的SQL代码段;浏览器(读取:任何HTTP客户端)可以将任何自由形式的SQL发送回服务器。如果您的服务器只是从任意客户端执行任何给定的SQL,那么您就死定了

获取一些已定义的参数并将其转换为SQL。例如:

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

首先要明确的是,您称之为“sql查询的一小部分”的内容称为http查询字符串及其传递的GET请求,在PHP中可通过
$\u GET
数组获得,因此在将其传递到sql查询之前,它在技术上不是sql查询的一部分

为了回答你的问题,-如果你清理变量是安全的,对于PHP你必须使用
mysqli\u real\u escape\u string
函数,看看这里

如果必须使用PDO,则使用
PDO::prepare
,它会自动引用变量内容以防止SQL注入。

首先要明确的是,您称之为“sql查询的一小部分”的内容称为http查询字符串及其传递的GET请求,在PHP中可通过
$\u GET
数组获得,因此在将其传递到sql查询之前,它在技术上不是sql查询的一部分

为了回答你的问题,-如果你清理变量是安全的,对于PHP你必须使用
mysqli\u real\u escape\u string
函数,看看这里

如果必须使用PDO,则使用
PDO::prepare
,它会自动引用变量内容以防止SQL注入。
如果您打算将表单中的文本直接粘贴到“where”子句的末尾,我觉得这是个坏主意。如果您正在使用设置为“ParentCategory=1”的表单值执行POST,那么某人可以通过POST和GET轻松地执行SQL注入(有关更多信息,请参阅)

更好的方法是这样:

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

    从产品列表中选择*,其中父类=2

  • 将用PHP构造的查询发送到数据库


  • 如果您打算将表单中的文本直接粘贴到“where”子句的末尾,那么这对我来说似乎是个坏主意。如果您正在使用设置为“ParentCategory=1”的表单值执行POST,那么某人可以通过POST和GET轻松地执行SQL注入(有关更多信息,请参阅)

    更好的方法是这样:

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

    从产品列表中选择*,其中父类=2

  • 将用PHP构造的查询发送到数据库


  • GET
    注入并不比
    POST
    更安全-任何现代浏览器都有一个捆绑的调试工具集,允许您操作
    POST
    数据。至于这是否是一个安全缺陷——这取决于你对这些变量做了什么以及你是如何构建查询的——我们不能在没有看到一些代码的情况下回答这个问题