Php 使用MySQL重新进行SQL注入攻击,这是否满足基线要求?
我有一个单页应用程序,浏览器在其中完成所有逻辑工作。除了初始加载之外,服务器几乎是数据库的一个奇特接口 例如,浏览器发送数据字典键、列名/值对以及SELECT的where子句。服务器将这些部分组装到SQL中,执行查询并回复。新建:例如,在SELECT中,从数据字典中提取表名和列-浏览器提供数据字典键和SELECT where子句 这种非常开放的环境非常容易受到SQL注入攻击。目标是防止上述攻击造成损害 需要克服的问题 首先,由于无法对随机SELECTPhp 使用MySQL重新进行SQL注入攻击,这是否满足基线要求?,php,mysql,security,mysqli,sql-injection,Php,Mysql,Security,Mysqli,Sql Injection,我有一个单页应用程序,浏览器在其中完成所有逻辑工作。除了初始加载之外,服务器几乎是数据库的一个奇特接口 例如,浏览器发送数据字典键、列名/值对以及SELECT的where子句。服务器将这些部分组装到SQL中,执行查询并回复。新建:例如,在SELECT中,从数据字典中提取表名和列-浏览器提供数据字典键和SELECT where子句 这种非常开放的环境非常容易受到SQL注入攻击。目标是防止上述攻击造成损害 需要克服的问题 首先,由于无法对随机SELECTwhere子句进行参数化,SELECT不能使用
where子句进行参数化,SELECT不能使用预先准备好的语句
其次,mysqli
,用于MySQL参数化语句的库,不支持NULL或MySQL函数,例如,CURRENT_DATE或NOW()
提议的解决办法
首先,如果SELECT无法参数化,则由没有DML或DDL权限的用户执行SELECT。这将防止SQL注入攻击改变数据库
其次,为mysqli
编写一个包装函数,允许NULL和MySQL函数作为参数传递。这将使参数可轻松用于所有DML
第三,对正常查询或正常用户看不到或触摸不到的高度敏感数据进行阴影处理。这将使密码等敏感数据超出攻击范围
第四,编写一个包装器命令来强制执行用户/查询类型关系。例如,这将确保由SELECT
用户执行SELECT
这一努力的结果是。问题是,从逻辑上讲,这种方法能否成功抵御SQL注入攻击
非答案答案
我提出了同样的问题。由于我糟糕的演讲工作,收到的答案和评论最终都集中在虚假的问题上,而不是解决(无可否认)困难的问题——这真的有效吗
作为参考,这里有一些评论和答案
使用PDO准备的声明
首先,准备好的语句不能用于所有选择-PDO有什么帮助?其次,mysqli
不接受NULL或MySQL函数-PDO有什么帮助
为什么要重新发明轮子
如果你知道克服这些问题的方法,我真的很想知道——这是一个困难的问题
看不到mysql\u real\u escape\u string()
在传递给数据库查询函数之前,应该对值进行清理mysql\u real\u escape\u string()
是一组可用的消毒功能之一,例如,可以对日期使用不同的消毒液
太多的工作
请与我分享您对克服这些问题的任何方法的了解-我真的希望有更好的洞察力。这就是说,从我重新设置整个过程开始,按照我的笔记,花了30到45分钟。此后不产生任何时间成本
我对mysqli感到满意
当无法参数化SELECT时,如何防止SQL注入攻击?在更新列时,您是否希望从不使用NULL?每个人都有自己的毒药,但这些是我希望解决的问题——而不是忍受
@科内拉克指出,参数数量有限
对。更改为代码以使用eval()
(抖动),从而解决了问题。需要安全审查
问题又来了
这种方法能否在克服无参数化SELECT和mysqli的参数限制的同时防止SQL注入攻击?答案很简单:
对于参数,请使用PDO或mysql\u real\u escape\u string()
对于其他动态SQL(表名、列名、语法元素),请使用白名单
见:
您不能信任浏览器保持在您在Javascript中设置的范围内。这很容易操纵。因此,您必须将来自该端的所有数据视为不可信。确保对照允许的关键字列表检查where子句中的所有元素
为此,您可以使用:
=,>,如NULL,为
AND,或XOR,NOT
我想你没有读过这个问题!如果无法参数化SELECT
where子句
,如何将其列入白名单?如果mysqli
不能接受NULL或MySQL函数,那么PDO将如何帮助呢?我阅读了这个问题。如果执行从表1中选择$var
,则需要对照允许的列名白名单检查$var。请阅读链接。确实阅读了链接-做得好!首先,要选择的列不是由浏览器设置的,而是数据字典的一部分,因此不需要白名单。其次,如果where子句
不能被参数化,那么它就不能被白名单,因此我们仍然存在问题-参见示例,例如,“不同于”-我仍然正确地维护where子句的白名单需要一个完整的SQL解析器。请注意,如果查询失败是可以的-不可以的是SQL注入攻击是否有害。@cc young,想想看,还有另一种方法。Stackexchange允许对其数据库(实际上是它的副本)进行自定义查询。您必须检查它的安全性,只允许访问数据的子集,只允许选择sh