PHP codeigniter SQL 注入(MSSQL)
PHP codeigniter SQL Injection(MSSQL)
我收到的报告显示我的查询有 SQL 注入,需要您的帮助来验证一些问题:
- 我用这个作为插入语句
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注入?如果这不能阻止我认为最好的方法是查询绑定?
如果 $POST['column'] 是数组,我如何防止 SQL 注入?
如何像人插入一样存储数据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 注入,这正是您真正想要的。
我收到的报告显示我的查询有 SQL 注入,需要您的帮助来验证一些问题:
- 我用这个作为插入语句
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注入?如果这不能阻止我认为最好的方法是查询绑定?
如果 $POST['column'] 是数组,我如何防止 SQL 注入?
如何像人插入一样存储数据
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 注入,这正是您真正想要的。