PHP安全地将URL放入表单以防止xss /跨站点请求伪造CSRF攻击

时间:2016-08-19 05:38:45

标签: php forms xss csrf

我在php中使用html表格如下:

<form method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>">
.
.
</form>

但是当我测试CSRF / XSS攻击时,注入此页面非常容易。 有什么好方法可以防止这种攻击吗?

3 个答案:

答案 0 :(得分:3)

对于CSRF保护 -

  • 使用csrf令牌,现在什么是csrf令牌,它只是一个唯一值,它将由您的应用程序为每个表单提交事件生成,并作为输入隐藏值附加到每个表单。 同时应用程序需要将该csrf标记值设置为SESSION,以便在表单提交时它可以检查标记值是否有效。这是保护CSRF攻击的一种方式。

对于XSS保护 -

  • 第一件事是设置表格验证前端和后端
  • 你可以使用不同的php过滤方法
  • 使用htmlspecialchars()在检索数据或显示数据时将特殊字符转换为HTML实体

答案 1 :(得分:1)

防止CSRF的唯一安全方法是将密钥(csrf令牌)与每个请求相关联,然后在表单提交时进行检查。你可以把它放在一个隐藏的输入中。

答案 2 :(得分:-1)

主要防御

选项#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