【发布时间】:2016-12-26 04:29:02
【问题描述】:
我在php中使用html表单如下:
<form method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>">
.
.
</form>
但是当我测试 CSRF / XSS 攻击时,很容易注入这个页面。 有什么好的方法可以防止此类攻击吗?
【问题讨论】:
-
csrf 令牌怎么样? :)
我在php中使用html表单如下:
<form method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>">
.
.
</form>
但是当我测试 CSRF / XSS 攻击时,很容易注入这个页面。 有什么好的方法可以防止此类攻击吗?
【问题讨论】:
对于 CSRF 保护 --
对于 XSS 保护 --
【讨论】:
主要防御:
选项 #1:使用准备好的语句(参数化查询)
选项 #2:使用存储过程
选项 #3:转义所有用户提供的输入
附加防御:
同时执行:最小权限
同时执行:白名单输入验证
对于选项 #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
【讨论】:
mysql_real_escape_string($data); 没有! mysql_* 方法已被弃用多年。使用 mysqli_* 或 PDO,甚至更好地使用准备好的语句。
防止 CSRF 的唯一安全方法是将密钥(csrf 令牌)与每个请求相关联,然后在提交表单时对其进行检查。你可以把它放在一个隐藏的输入中。
【讨论】: