Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用MySQL重新进行SQL注入攻击,这是否满足基线要求?_Php_Mysql_Security_Mysqli_Sql Injection - Fatal编程技术网

Php 使用MySQL重新进行SQL注入攻击,这是否满足基线要求?

Php 使用MySQL重新进行SQL注入攻击,这是否满足基线要求?,php,mysql,security,mysqli,sql-injection,Php,Mysql,Security,Mysqli,Sql Injection,我有一个单页应用程序,浏览器在其中完成所有逻辑工作。除了初始加载之外,服务器几乎是数据库的一个奇特接口 例如,浏览器发送数据字典键、列名/值对以及SELECT的where子句。服务器将这些部分组装到SQL中,执行查询并回复。新建:例如,在SELECT中,从数据字典中提取表名和列-浏览器提供数据字典键和SELECT where子句 这种非常开放的环境非常容易受到SQL注入攻击。目标是防止上述攻击造成损害 需要克服的问题 首先,由于无法对随机SELECTwhere子句进行参数化,SELECT不能使用

我有一个单页应用程序,浏览器在其中完成所有逻辑工作。除了初始加载之外,服务器几乎是数据库的一个奇特接口

例如,浏览器发送数据字典键、列名/值对以及SELECT的where子句。服务器将这些部分组装到SQL中,执行查询并回复。新建:例如,在SELECT中,从数据字典中提取表名和列-浏览器提供数据字典键和SELECT where子句

这种非常开放的环境非常容易受到SQL注入攻击。目标是防止上述攻击造成损害

需要克服的问题 首先,由于无法对随机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
  • 所有值都必须正确地用单引号括起来,并且您需要通过mysql\u real\u escape\u string()将这些值输入,以确保没有欺诈行为
  • 所有不在(1,2)中且不包含在单引号中的值都是列名,请对照允许的列名白名单进行检查
  • 拒绝所有其他输入

  • 我想你没有读过这个问题!如果无法参数化SELECT
    where子句
    ,如何将其列入白名单?如果
    mysqli
    不能接受NULL或MySQL函数,那么PDO将如何帮助呢?我阅读了这个问题。如果执行
    从表1中选择$var
    ,则需要对照允许的列名白名单检查$var。请阅读链接。确实阅读了链接-做得好!首先,要选择的列不是由浏览器设置的,而是数据字典的一部分,因此不需要白名单。其次,如果
    where子句
    不能被参数化,那么它就不能被白名单,因此我们仍然存在问题-参见示例,例如,“不同于”-我仍然正确地维护where子句的白名单需要一个完整的SQL解析器。请注意,如果查询失败是可以的-不可以的是SQL注入攻击是否有害。@cc young,想想看,还有另一种方法。Stackexchange允许对其数据库(实际上是它的副本)进行自定义查询。您必须检查它的安全性,只允许访问数据的子集,只允许选择sh