Php 用HTML显示SQL查询的一小部分是否安全?
假设我有一个卖乐器的网站。我使用PHP和MySQL动态构建标签为Php 用HTML显示SQL查询的一小部分是否安全?,php,sql,Php,Sql,假设我有一个卖乐器的网站。我使用PHP和MySQL动态构建标签为products.PHP的产品页面 现在,我的表有多个列,例如ParentCategory等等。按下products选项卡将带您进入category.php,在那里您可以按下一些分类按钮,这将带您进入products.php,并仅显示相关的产品 现在,问题来了。要从数据库中检索项目,我们需要设置如下查询 从产品列表中选择*,其中ParentCategory=1 从类别页面,按钮被包装成一个表单,每个按钮使用POST提交一个名为que
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注入(有关更多信息,请参阅) 更好的方法是这样:
如果您打算将表单中的文本直接粘贴到“where”子句的末尾,那么这对我来说似乎是个坏主意。如果您正在使用设置为“ParentCategory=1”的表单值执行POST,那么某人可以通过POST和GET轻松地执行SQL注入(有关更多信息,请参阅) 更好的方法是这样:
GET
注入并不比POST
更安全-任何现代浏览器都有一个捆绑的调试工具集,允许您操作POST
数据。至于这是否是一个安全缺陷——这取决于你对这些变量做了什么以及你是如何构建查询的——我们不能在没有看到一些代码的情况下回答这个问题