PHP codeigniter SQL 注入(MSSQL)

PHP codeigniter SQL Injection(MSSQL)

我收到的报告显示我的查询有 SQL 注入,需要您的帮助来验证一些问题:

  1. 我用这个作为插入语句
  function insert($table_name, $insert_data)
    {
        $this->db->set($insert_data);
        if ($this->db->insert($table_name)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

例如:

$name = 'iamklll';
$status = 1;

  $insert_data =
                array(             
                'name' => $name,
                'status' => $status,
                );
  $this->model->insert('table', $insert_data);  

这种方法不能防止SQL注入?如果这不能阻止我认为最好的方法是查询绑定?

  1. 如果 $POST['column'] 是数组,我如何防止 SQL 注入?

  2. 如何像人插入一样存储数据test"><h1>eee</h1>?我应该使用 htmlspecialchars 存储在数据库中吗?

您指的是 Active Record class。它有自己的查询构建器,它可以保护您免受 SQL 开箱即用的注入。

How to store the data as if the person insert test"><h1>eee</h1>

我认为您指的是 XSS 攻击。我相信最好把它练到strip out all the tags except allowable tags。当您要对输出进行反向转换时,我认为 htmlspecialchars 在这里没有多大意义。

在您的情况下,您使用的是查询生成器 $this->db->insert(),它会根据您提供的数据生成一个插入字符串,并且 运行 是查询。您可以将数组或对象传递给函数。 所有值都自动转义 产生更安全的查询。

这实际上是我认为的最佳选择。比使用查询绑定更好,特别是因为在长 运行 中,您可能需要从 MSSQL 更改为 mySQL 或任何其他引擎,并且您不需要更改代码中的任何内容。

由于您使用的是 codeigniter 3,因此请务必在插入之前验证您的数据。

为此使用表单验证:https://codeigniter.com/userguide3/libraries/form_validation.html?highlight=form%20validation

从你的例子来看,我认为你也指的是 xxs 攻击。如果是这样,您有两个选择,您可以在使用 XSS 规则通过表单验证来验证数据时执行此操作。或者您可以在 application/config/config.php

中全局激活它
$config['global_xss_filtering'] = true;

由于我们正在谈论保护您的应用程序,您可能还想考虑使用 codeigniter 中的 csrf 设置。这也可以在您的 config.php 文件中完成。

/*
|--------------------------------------------------------------------------
| Cross Site Request Forgery
|--------------------------------------------------------------------------
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
| checked on a submitted form. If you are accepting user data, it is strongly
| recommended CSRF protection be enabled.
|
| 'csrf_token_name' = The token name
| 'csrf_cookie_name' = The cookie name
| 'csrf_expire' = The number in seconds the token should expire.
| 'csrf_regenerate' = Regenerate token on every submission
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
 */
$config['csrf_protection'] = true;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = true;
$config['csrf_exclude_uris'] = array();

因此,在您的情况下,使用查询构建器可以很好地防止 SQL 注入,这正是您真正想要的。