我在php中使用html表单如下:
<form method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>">
.
.
</form>
但是当我测试CSRF/XSS攻击时,很容易注入这个页面。有没有什么好办法来防止这种攻击?
For CSRF Protection -
- 使用csrf令牌,现在什么是csrf令牌它只是一个唯一的值,它将由您的应用程序为每个表单提交事件生成,并附加到每个表单作为输入隐藏值。同时,应用程序需要将csrf令牌值设置为SESSION,以便在表单提交时可以检查令牌值是否有效。这是保护CSRF攻击的一种方法。
For XSS Protection -
- 第一件事是设置前端和后端验证
- 你可以使用不同的php过滤器方法
- 使用htmlspecialchars()在检索数据或显示数据时将特殊字符转换为HTML实体
防止CSRF的唯一安全方法是将秘钥(CSRF令牌)与每个请求关联,然后在表单提交时检查它。你可以把它放在一个隐藏的输入
主要防御:
选项#1:使用预处理语句(参数化查询)
选项#2:使用存储过程
选项#3:转义所有用户输入
附加防御:
Also Enforce: Least Privilege
同时执行:白名单输入验证
For option #3使用这个函数:
要使用mysqli_real_escape_str函数,您需要mysqli,以便在codeigniter
中获得它function get_mysqli() {
$db = (array)get_instance()->db;
return mysqli_connect('localhost', $db['username'], $db['password'],$db['database']);
}
public function filter($data)
{
$data = trim(htmlentities(strip_tags($data)));
// print_r($data);
if (get_magic_quotes_gpc()){
// print_r($data);
$data = stripslashes($data);
// print_r($data);
$data = mysqli_real_escape_string(get_mysqli(),$data);
// print_r($data);
}
return $data;
}
循环用户输入:
foreach($_POST as $key => $value) {
$array[$key] = $this->filter($value);
}
看看这个:
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet