【问题标题】:PHP codeigniter SQL Injection(MSSQL) [duplicate]PHP codeigniter SQL注入(MSSQL)[重复]
【发布时间】:2021-02-09 14:58:44
【问题描述】:

我收到的报告显示我的查询存在 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 来存储数据库吗?

【问题讨论】:

  • 您使用的是什么版本的 Codeigniter?
  • @Yevgen 是 Codigniter 3

标签: php sql sql-server codeigniter sql-injection


【解决方案1】:

在您的情况下,您使用的是查询构建器 $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 注入正是您真正想要的。

【讨论】:

    【解决方案2】:

    您指的是 Active Record 类。它有自己的查询生成器,它可以保护您免受来自盒子的 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 在这里没有多大意义,而您要对输出进行反向转换。

    【讨论】:

    • 如果我的数据库存储像 test"&gt;&lt;h1&gt;eee&lt;/h1&gt; 这样可以吗?
    • 这取决于谁放置这些数据以及谁获取它。如果普通用户可以分解标记,那就不好了,但我一般认为数据库中的 HTML 标记没有任何问题。你也可以考虑阅读 CI 中的 global_xss_filtering 配置选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2013-05-01
    • 2019-05-25
    相关资源
    最近更新 更多