我的代码已经是安全的,在sql查询中使用参数,但是,我想检测是否有人试图向提交表单中注入某些内容。我找到了snort,但是我需要一些php脚本级别的东西,而不是整个网络。这是为一个网站,其中包含学生的个人信息,因此,我们将警告(甚至采取行动)任何人,甚至试图攻击。
1tu0hz3e1#
这实际上是一个很难的主题。billyk可能有一个半可行的方法,但最好让mysql为您做艰苦的工作;因此:1) 在mysql事务中运行用户构造的(即不安全的)查询。2) 它给出了多少结果(检查返回的行和受影响的行)3) 记录所有mysql错误警告日志。4) 取消/回滚事务。所以你的数据库没有任何变化。5) 使用参数化变量(即safe)重新运行查询6) 它给出了多少结果(检查返回的行和受影响的行)7) 检查(6)是否为(2)提供了不同数量的结果,或者(5)是否提供了任何sql错误警告。您还可以使用php数组比较特性来检查结果集是否相等。8) 出现任何积极的情况,例如结果计数的差异、结果集equality或sql警告,然后将该查询字符串记录到一个保存文件中以供人员查看。
有了一个正确实现的预处理语句系统,就不可能从用户变量中以数据字符串的形式进行sql注入。因此,就像人们向坦克投掷水气球一样;试图“发现”这些违规行为也是毫无价值的;他们自己不会给你任何东西比有人看一些网站,提供了这样的方法。因此,只要您正确构建了php/sql,那么任何数量或质量的sql注入尝试都只是九牛一毛,并且您在尝试检测和记录它们时所浪费的处理能力、时间和精力要比忽略它们所浪费的时间和精力要多。
ma8fv8wu2#
我创建了一个非常基本和简单的php类,用于检查/检测sql注入尝试。
<?php /** * simpleSQLinjectionDetect Class * @link https://github.com/bs4creations/simpleSQLinjectionDetect * @version 1.1 */ class simpleSQLinjectionDetect { protected $_method = array(); protected $_suspect = null; public $_options = array( 'log' => true, 'unset' => true, 'exit' => true, 'errMsg' => 'Not allowed', ); public function detect() { self::setMethod(); if(!empty($this->_method)) { $result = self::parseQuery(); if ($result) { if ($this->_options['log']) { self::logQuery(); } if ($this->_options['unset']){ unset($_GET, $_POST); } if ($this->_options['exit']){ exit($this->_options['errMsg']); } } } } private function setMethod() { if ($_SERVER['REQUEST_METHOD'] === 'GET') { $this->_method = $_GET; } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $this->_method = $_POST; } } private function parseQuery() { $operators = array( 'select * ', 'select ', 'union all ', 'union ', ' all ', ' where ', ' and 1 ', ' and ', ' or ', ' 1=1 ', ' 2=2 ', ' -- ', ); foreach($this->_method as $key => $val) { $k = urldecode(strtolower($key)); $v = urldecode(strtolower($val)); foreach($operators as $operator) { if (preg_match("/".$operator."/i", $k)) { $this->_suspect = "operator: '".$operator."', key: '".$k."'"; return true; } if (preg_match("/".$operator."/i", $v)) { $this->_suspect = "operator: '".$operator."', val: '".$v."'"; return true; } } } } private function logQuery() { $data = date('d-m-Y H:i:s') . ' - '; $data .= $_SERVER['REMOTE_ADDR'] . ' - '; $data .= 'Suspect: ['.$this->_suspect.'] '; $data .= json_encode($_SERVER); @file_put_contents('./logs/sql.injection.txt', $data . PHP_EOL, FILE_APPEND); } } /* then call it in your app... *********************************************/ $inj = new simpleSQLinjectionDetect(); $inj->detect();
你也可以在github上查看这是一门非常简单的基础课。欢迎提出任何改进/更新建议:)
2条答案
按热度按时间1tu0hz3e1#
这实际上是一个很难的主题。billyk可能有一个半可行的方法,但最好让mysql为您做艰苦的工作;因此:
1) 在mysql事务中运行用户构造的(即不安全的)查询。
2) 它给出了多少结果(检查返回的行和受影响的行)
3) 记录所有mysql错误警告日志。
4) 取消/回滚事务。所以你的数据库没有任何变化。
5) 使用参数化变量(即safe)重新运行查询
6) 它给出了多少结果(检查返回的行和受影响的行)
7) 检查(6)是否为(2)提供了不同数量的结果,或者(5)是否提供了任何sql错误警告。您还可以使用php数组比较特性来检查结果集是否相等。
8) 出现任何积极的情况,例如结果计数的差异、结果集equality或sql警告,然后将该查询字符串记录到一个保存文件中以供人员查看。
概念思路:
有了一个正确实现的预处理语句系统,就不可能从用户变量中以数据字符串的形式进行sql注入。因此,就像人们向坦克投掷水气球一样;试图“发现”这些违规行为也是毫无价值的;他们自己不会给你任何东西比有人看一些网站,提供了这样的方法。
因此,只要您正确构建了php/sql,那么任何数量或质量的sql注入尝试都只是九牛一毛,并且您在尝试检测和记录它们时所浪费的处理能力、时间和精力要比忽略它们所浪费的时间和精力要多。
ma8fv8wu2#
我创建了一个非常基本和简单的php类,用于检查/检测sql注入尝试。
你也可以在github上查看
这是一门非常简单的基础课。欢迎提出任何改进/更新建议:)