【问题标题】:How can I prevent sitewide SQL Injection for good? [closed]如何永久防止站点范围的 SQL 注入? [关闭]
【发布时间】:2013-08-24 19:10:16
【问题描述】:

我的一个客户有一个网站在过去的日子里被过度入侵。黑客使用的方法是未知的,但是我已经设法保护了几乎所有的东西,除了关于 SQL 注入的问题。

问题是该网站的源代码非常混乱,它有很多很多的表单,这些表单都没有受到 SQL 注入的保护。

我认为的解决方案是防止在网站内提交的任何表单在被检查之前被处理。它将在主“index.php”文件中进行检查,该文件将网站上的每个请求重定向到所需的控制器和模型。

我需要一个好的 PHP 脚本(或通过指导我编写此代码来帮助我)来处理所有提交的表单($_GET 和 $_POST)并确定用户是否正在尝试提交任何表单“sql”数据,如果是,则记录该请求并拒绝提交表单。

这是 index.php 的一部分,我将放置这段代码:

public function load_controller()
{

    $controller_name = $this->uri['controller'];
    $action = $this->uri['action'];
    $param = $this->uri['param'];
    $model = $this->uri['model'];
    $controller_name = ucwords($controller_name);
    $file = ROOT.DS.'admin'.DS.'controller'.DS."$controller_name".'_controller.php';
    if(file_exists($file))
    {

        require_once($file) ; 

        $controller = new $controller_name(); 

        if(method_exists($controller,$action))
        {

            $controller->{$action}($param[0],$param[1],$param[2],$param[3],
        $param[4],$param[5],$param[6],$param[7]);   
        }
        else
        {
            define('HEADER_SENT', '/router.php?num=404');
        }
    }
    else
    {
        define('HEADER_SENT', '/router.php?num=404');
    }
}

当然,如果您认为这不是一个好的解决方案,请告诉我您的想法是什么,请记住,我们解决此问题的时间有限。

谢谢:)

【问题讨论】:

  • 这不是远程 sql 注入。
  • 上面的代码不是sql注入,我想把新代码放在这个代码之外(在上面),以防止从整个网站提交的表单中处理与sql注入相关的字符.
  • 只使用参数化查询。那你就不用担心SQL注入了。

标签: php sql sql-server forms


【解决方案1】:

尝试解析输入是愚蠢的游戏。除非您编写了一个完整的数据库引擎,否则您永远不会正确,并且您说时间至关重要。那么为什么要打扰呢?唯一万无一失的方法是完全消除任何用户输入的机会。

正确的方法是使用参数化查询和/或存储过程,或者,正确实现的某种 ORM 方法只是上述方法的抽象。

【讨论】:

  • +1 除了参数化查询,没有其他正确答案。
猜你喜欢
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 2016-06-10
  • 2015-09-07
  • 1970-01-01
  • 2014-08-18
  • 2013-10-29
  • 2011-06-21
相关资源
最近更新 更多