假设我有一个销售乐器的网站。我正在使用PHP和MySQL来动态构建标记为products.php
的产品页面。
现在我的表有多个列,例如ParentCategory
等。按products
标签会转到category.php
,您可以在其中按下一些分类按钮,这会将您带到products.php
并仅显示相关产品。< / p>
现在,这里解决了这个问题。要从数据库中检索项目,我们需要设置类似
的查询 SELECT * FROM productlist WHERE ParentCategory=1
在类别页面中,按钮以表单形式包装,每个按钮使用 query
提交名为POST
的变量。该值类似于ParentCategory=1
。
隐藏了带有tablename的完整SQL查询,但是按钮必须提交的多个子查询(例如ParentCategory=1
或ParentCategory=2
)显示在页面本身的HTML中。< / p>
我想知道的是,这是一个巨大的安全漏洞?如同,恶意用户是否可以利用此类信息进行黑客攻击?就个人而言,我想不出用户在知道其列名后才能利用该网站的方式,但我也只是开始进行网站开发。
如果是这种情况,那么这些查询传递的最安全或最通用的方法是什么?我会想到GET
但是这会延长URL并打开注入问题,因为任何值都可以传递。
答案 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?)。
更好的方法是这样的:
您的PHP代码构造一个查询,将您的表单参数映射到数据库列的名称:
SELECT * FROM productlist WHERE parent_category = 2
将用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