我如何才能永远阻止站点范围内的SQL注入


How can I prevent sitewide SQL Injection for good?

我的一个客户的网站在过去的几天里被过度黑客攻击。黑客使用的方法是未知的,但我已经设法保护了几乎所有的东西,除了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');
    }
}

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

感谢:)

尝试分析输入是愚蠢的游戏。除非你写了一个完整的数据库引擎,否则你永远不会把它做好,而且你说时间是至关重要的。那为什么要麻烦呢?唯一万无一失的方法是完全消除任何用户输入的机会。

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