本文目录一览:
- 1、php防止sql注入以及xss跨站脚本攻击
- 2、3大Web安全漏洞防御详解:XSS、CSRF、以及SQL注入解决方案
- 3、SpringBoot 防止SQL注入、XSS攻击、CSRF/CROS恶意访问
- 4、PHP如何做好最基础的安全防范
- 5、Cookie如何防范XSS攻击?
- 6、如何防止XSS跨站攻击,让fortify检测通过
php防止sql注入以及xss跨站脚本攻击
1.post数据
封装转义函数 防sql注入 eag:addslashes($username);addslashes($password);
eag:防止sql注入函数封装
function deepslashes($data){
#判断$data的表现形式 并且需要处理空的情况
if(empty($data)){
return($data);
}
#高级简写 return is_array($data) ? array_map('deepslashes',$data) : addslashes($data);
#初级写法
if(is_array($data)){
#递归循环遍历处理多维数组
foreach ($data as $v) {
return deepslashes($v);
}
}else{
#单一变量
return addslashes($data);
}
#初级写法
}
2.get数据
指url 传参数导致sql发生改变
解决方案
①强制转换,使用函数intval 或者 数据类型 的关键字int
②隐式转换,通过运算,只需要+0即可
3.xss跨站脚本攻击
指恶意攻击向web页面插入html、js标签导致页面出现错误
解决方案
转义标签'' ''即可,有以下php函数可解决
htmlspecialchars 函数 和 htmlentites函数
eag:
function deepslashes($data){
#判断$data的表现形式 并且需要处理空的情况
if(empty($data)){
return($data);
}
return is_array($data) ? array_map('deepslashes',$data) : htmlspecialchars ($data);
}
3大Web安全漏洞防御详解:XSS、CSRF、以及SQL注入解决方案
随着互联网的普及, *** 安全变得越来越重要。Java等程序员需要掌握基本的web安全知识,防患于未然,下面列举一些常见的安全漏洞,以及对应的防御解决方案。
1.前端安全
2.后端安全
1.XSS简介
跨站脚本(cross site script)简称为XSS,是一种经常出现在web应用中的计算机安全漏洞,也是web中最主流的攻击方式。
XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去,使别的用户访问都会执行相应的嵌入代码。
2.XSS攻击的危害
1、盗取用户资料,比如:登录帐号、网银帐号等
2、利用用户身份,读取、篡改、添加、删除企业敏感数据等
3、盗窃企业重要的具有商业价值的资料
4、非法转账
5、强制发送电子邮件
6、网站挂马
7、控制受害者机器向其它网站发起攻击
3.防止XSS解决方案
XSS的根源主要是没完全过滤客户端提交的数据 ,所以重点是要过滤用户提交的信息。
1.CSRF简介
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。
XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF更具危险性。
2.CSRF攻击的危害
主要的危害来自于,攻击者盗用了用户身份,发送恶意请求。比如:模拟用户的行为发送邮件,发消息,以及支付、转账等财产安全。
3.防止CSRF的解决方案
1.简介
SQL注入是比较常见的 *** 攻击方式之一,主要是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,实现无帐号登录,甚至篡改数据库。
2.SQL注入的危害
3.防止SQL注入的方式
通常情况下,SQL注入的位置包括:
(1)表单提交,主要是POST请求,也包括GET请求;
(2)URL参数提交,主要为GET请求参数;
(3)Cookie参数提交;
(4)HTTP请求头部的一些可修改的值,比如Referer、User_Agent等;
4.简要举例
举一个简单的例子,select * from user where id=100 ,表示查询id为100的用户信息,如果id=100变为 id=100 or 2=2,sql将变为:select * from user where id=100 or 2=2,将把所有user表的信息查询出来,这就是典型的sql注入。
5.防止SQL注入的解决方案
1)对用户的输入进行校验,使用正则表达式过滤传入的参数
2)使用参数化语句,不要拼接sql,也可以使用安全的存储过程
3)不要使用管理员权限的数据库连接,为每个应用使用权限有限的数据库连接
4)检查数据存储类型
5)重要的信息一定要加密
总之就是既要做好过滤与编码并使用参数化语句,也要把重要的信息进行加密处理,这样sql注入漏洞才能更好的解决。
以上就是Web安全介绍,更多Redis系列、Spring Cloud、Dubbo等微服务、MySQL数据库分库分表等架构设计,具体请参考:
回复关键词 【高并发】即可获取!
SpringBoot 防止SQL注入、XSS攻击、CSRF/CROS恶意访问
一、SQL 注入问题
SQL 注入即是指 web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
简单来说,就是将大部分 SQL 语句当参数传入系统中,从而获取系统中的数据。下面简单举例说明
系统中有这样一条信息 SQL 语句执行,分页查询所有用户,每页查询 20 条,并且根据指定字段进行排序,也就是说排序字段也是参数传递过来的
SQL 注入问题分析:
这样很简单的一句话 SQL,就可以把系统搞炸掉,这种方式可以实现删库跑路
以上语句会把整个 test 数据库所有内容都删掉
尽量用预编译机制,少用字符串拼接的方式传参,它是 sql 注入问题的根源。
有些特殊字符,比如:%作为 like 语句中的参数时,要对其进行转义处理。
需要对所有的异常情况进行捕获,切记接口直接返回异常信息,因为有些异常信息中包含了 sql 信息,包括:库名,表名,字段名等。攻击者拿着这些信息,就能通过 sql 注入随心所欲地攻击你的数据库了。目前比较主流的做法是,有个专门的网关服务,它统一暴露对外接口。用户请求接口时先经过它,再由它将请求转发给业务服务。这样做的好处是:能统一封装返回数据的返回体,并且如果出现异常,能返回统一的异常信息,隐藏敏感信息。此外还能做限流和权限控制。
使用 sqlMap 等待代码检测工具,它能检测 sql 注入漏洞。
需要对数据库 sql 的执行情况进行监控,有异常情况,及时邮件或短信提醒。
对生产环境的数据库建立单独的账号,只分配 DML 相关权限,且不能访问系统表。切勿在程序中直接使用管理员账号。
建立代码 review 机制,能找出部分隐藏的问题,提升代码质量。
对于不能使用预编译传参时,要么开启 druid 的 filter 防火墙,要么自己写代码逻辑过滤掉所有可能的注入关键字。
XSS 攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的 *** 注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是 JavaScript,但实际上也可以包括 Java、 VBScript、ActiveX、 Flash 或者甚至是普通的 HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和 cookie 等各种内容。
通常情况下,被用来盗用 Cookie、破坏页面结构、重定向到其他网站等
对用户输入的表单信息进行检测过滤
CSRF - Cross-Site Request Forgery - 跨站请求伪造:
攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作,CORS - Cross Origin Resourse-Sharing - 跨站资源共享,恶意访问内网敏感资源。
有效的解决办法是通过多种条件屏蔽掉非法的请求,例如 HTTP 头、参数等:
防止大规模的恶意请求,niginx 反向 *** 可以配置请求频率,对 ip 做限制。nginx 可以很方便地做访问控制,特别是一些偶发性的大量恶意请求,需要屏蔽处理。
屏蔽 ip 地址
屏蔽 user-agent
屏蔽 *** ip
有两种情形会需要屏蔽 *** ip:一是 *** ip 访问,二是负载均衡(real-ip 请求负载均衡服务器,再 *** 给后端 server)
创建 XssAndSqlHttpServletRequestWrapper 包装器,这是实现 XSS 过滤的关键,在其内重写了 getParameter,getParameterValues,getHeader 等 *** ,对 http 请求内的参数进行了过滤
PHP如何做好最基础的安全防范
PHP如何做好最基础的安全防范
php给了开发者极大的灵活性,但是这也为安全问题带来了潜在的隐患,PHP如何做好最基础的安全防范呢?下面我为大家解答一下,希望能帮到您!
当开发一个互联网服务的时候,必须时刻牢记安全观念,并在开发的代码中体现。PHP脚本语言对安全问题并不关心,特别是对大多数没有经验的开发者来说。每当你讲任何涉及到钱财事务等交易问题时,需要特别注意安全问题的考虑,例如开发一个论坛或者是一个购物车等。
安全保护一般性要点
不相信表单
对于一般的Javascript前台验证,由于无法得知用户的行为,例如关闭了浏览器的javascript引擎,这样通过POST恶意数据到服务器。需要在服务器端进行验证,对每个php脚本验证传递到的数据,防止XSS攻击和SQL注入。
不相信用户
要假设你的网站接收的每一条数据都是存在恶意代码的,存在隐藏的威胁,要对每一条数据都进行清理
关闭全局变量
在php.ini文件中进行以下配置:
register_globals = Off
如果这个配置选项打开之后,会出现很大的安全隐患。例如有一个process.php的脚本文件,会将接收到的数据插入到数据库,接收用户输入数据的表单可能如下:
input name="username" type ="text" size = "15" maxlength = "64"
这样,当提交数据到process.php之后,php会注册一个$username变量,将这个变量数据提交到process.php,同时对于任何POST或GET请求参数,都会设置这样的变量。如果不是显示进行初始化那么就会出现下面的问题:
?php
// Define $authorized = true only if user is authenticated
if
(authenticated_user()) {
$authorized = true;
}
?
此处,假设authenticated_user函数就是判断$authorized变量的值,如果开启了register_globals配置,那么任何用户都可以发送一个请求,来设置$authorized变量的值为任意值从而就能绕过这个验证。所有的这些提交数据都应该通过PHP预定义内置的全局数组来获取,包括$_POST、$_GET、$_FILES、$_SERVER、$_REQUEST等,其中$_REQUEST是一个$_GET/$_POST/$_COOKIE三个数组的联合变量,默认的顺序是$_COOKIE、$_POST、$_GET。
推荐的安全配置选项
error_reporting设置为Off:不要暴露错误信息给用户,开发的时候可以设置为ON
safe_mode设置为Off
register_globals设置为Off
将以下函数禁用:system、exec、passthru、shell_exec、proc_open、popen
open_basedir设置为 /tmp ,这样可以让session信息有存储权限,同时设置单独的网站根目录expose_php设置为Offallow_url_fopen设置为Offallow_url_include设置为Off
SQL注入攻击
对于操作数据库的SQL语句,需要特别注意安全性,因为用户可能输入特定语句使得原有的SQL语句改变了功能。类似下面的例子:
$sql ="select * from pinfo where product = '$product'";
此时如果用户输入的$product参数为:'39'; DROP pinfo; SELECT 'FOO
那么最终SQL语句就变成了如下的`样子:
select product from pinfo where product = '39';
DROP pinfo;
SELECT 'FOO'
这样就会变成三条SQL语句,会造成pinfo表被删除,这样会造成严重的后果。这个问题可以简单的使用PHP的内置函数解决:
$sql = 'Select * from pinfo where product = '"' mysql_real_escape_string($product) . '"';
防止SQL注入攻击需要做好两件事:对输入的参数总是进行类型验证对单引号、双引号、反引号等特殊字符总是使用mysql_real_escape_string函数进行转义但是,这里根据开发经验,不要开启php的Magic Quotes,这个特性在php6中已经废除,总是自己在需要的时候进行转义。
防止基本的XSS攻击
XSS攻击不像其他攻击,这种攻击在客户端进行,最基本的XSS工具就是防止一段javascript脚本在用户待提交的表单页面,将用户提交的数据和cookie偷取过来。XSS工具比SQL注入更加难以防护,各大公司网站都被XSS攻击过,虽然这种攻击与php语言无关,但可以使用php来筛选用户数据达到保护用户数据的目的,这里主要使用的是对用户的数据进行过滤,一般过滤掉HTML标签,特别是a标签。下面是一个普通的过滤 *** :
function transform_HTML( $string , $length null) { // Helps prevent XSS attacks
// Remove dead space.
$string = trim( $string );
// Prevent potential Unicode codec problems.
$string = utf8_decode( $string );
// HTMLize HTML-specific characters.
$string = htmlentities( $string , ENT_NOQUOTES);
$string = str_replace ( "#" , "#" , $string );
$string = str_replace ( "%" , "%" , $string );
$length = intval ( $length );
if ( $length 0) {
$string = substr ( $string , 0, $length );
}return $string ;
}
这个函数将HTML的特殊字符转换为了HTML实体,浏览器在渲染这段文本的时候以纯文本形式显示。如bold会被显示为: BoldText 上述函数的核心就是htmlentities函数,这个函数将html特殊标签转换为html实体字符,这样可以过滤大部分的XSS攻击。但是对于有经验的XSS攻击者,有更加巧妙的办法进行攻击:将他们的恶意代码使用十六进制或者utf-8编码,而不是普通的ASCII文本,例如可以使用下面的方式进行:
这样浏览器渲染的结果其实是:
a href = ""
SCRIPT Dosomethingmalicious
这样就达到了攻击的目的。为了防止这种情况,需要在transform_HTML函数的基础上再将#和%转换为他们对应的实体符号,同时加上了$length参数来限制提交的数据的更大长度。
使用SafeHTML防止XSS攻击
上述关于XSS攻击的防护非常简单,但是不包含用户的所有标记,同时有上百种绕过过滤函数提交javascript代码的 *** ,也没有办法能完全阻止这个情况。目前,没有一个单一的脚本能保证不被攻击突破,但是总有相对来说防护程度更好的。一共有两个安全防护的方式:白名单和黑名单。其中白名单更加简单和有效。一种白名单解决方案就是SafeHTML,它足够智能能够识别有效的HTML,然后就可以去除任何危险的标签。这个需要基于HTMLSax包来进行解析。安装使用SafeHTML的 *** :
1、前往 下载最新的SafeHTML
2、将文件放入服务器的classes 目录,这个目录包含所有的SafeHTML和HTMLSax库
3、在自己的脚本中包含SafeHTML类文件
4、建立一个SafeHTML对象
5、使用parse *** 进行过滤
?php/* If you're storing the HTMLSax3.php in the /classes directory, along
with the safehtml.php script, define XML_HTMLSAX3 as a null string. */define(XML_HTMLSAX3, '' );// Include the class file.require_once ( 'classes/safehtml.php' );
// Define some sample bad code.
$data = This data would raise an alert
" ;// Create a safehtml object.$safehtml = new safehtml();// Parse and sanitize the data.$safe_data = $safehtml -parse( $data );// Display result. echo 'The sanitized data is ' . $safe_data ;
?
SafeHTML并不能完全防止XSS攻击,只是一个相对复杂的脚本来检验的方式。
使用单向HASH加密方式来保护数据
单向hash加密保证对每个用户的密码都是唯一的,而且不能被破译的,只有最终用户知道密码,系统也是不知道原始密码的。这样的一个好处是在系统被攻击后攻击者也无法知道原始密码数据。加密和Hash是不同的两个过程。与加密不同,Hash是无法被解密的,是单向的;同时两个不同的字符串可能会得到同一个hash值,并不能保证hash值的唯一性。MD5函数处理过的hash值基本不能被破解,但是总是有可能性的,而且网上也有MD5的hash字典。
使用mcrypt加密数据MD5 hash函数可以在可读的表单中显示数据,但是对于存储用户的信用卡信息的时候,需要进行加密处理后存储,并且需要之后进行解密。更好的 *** 是使用mcrypt模块,这个模块包含了超过30中加密方式来保证只有加密者才能解密数据。
?php$data = "Stuff you want encrypted" ;
$key = "Secret passphrase used to encrypt your data" ;
$cipher = "MCRYPT_SERPENT_256" $mode = "MCRYPT_MODE_CBC" ;function encrypt( $data, $key , cipher , $mode ) {// Encrypt datareturn (string) base64_encode ( mcrypt_encrypt ( $cipher , substr (md5( $key ),0,mcrypt_get_key_size( $cipher , $mode )), $data , $mode , substr (md5( $key ),0,mcrypt_get_block_size( $cipher , $mode )) ) );
}function decrypt( $data , $key ,$cipher , $mode ) {// Decrypt data
return (string) mcrypt_decrypt ( $cipher , substr (md5( $key ),0,mcrypt_get_key_size( $cipher , $mode )), base64_decode ( $data ), $mode , substr (md5( $key ),0,mcrypt_get_block_size( $cipher , $mode )) );
}?
mcrypt函数需要以下信息:
1、待加密数据
2、用来加密和解密数据的key
3、用户选择的加密数据的特定算法(cipher:
如 MCRYPT_TWOFISH192
,MCRYPT_SERPENT_256, MCRYPT_RC2
, MCRYPT_DES
, and MCRYPT_LOKI97
)
4、用来加密的模式
5、加密的种子,用来起始加密过程的数据,是一个额外的二进制数据用来初始化加密算法
6、加密key和种子的长度,使用mcrypt_get_key_size函数和mcrypt_get_block_size函数可以获取如果数据和key都被盗取,那么攻击者可以遍历ciphers寻找开行的方式即可,因此我们需要将加密的key进行MD5一次后保证安全性。同时由于mcrypt函数返回的加密数据是一个二进制数据,这样保存到数据库字段中会引起其他错误,使用了base64encode将这些数据转换为了十六进制数方便保存。
;
Cookie如何防范XSS攻击?
XSS(跨站脚本攻击)是指攻击者在返回的HTML中嵌入javascript脚本,为了减轻这些攻击,需要在HTTP头部配上set-cookie:
httponly此属性可以防止XSS,它会禁止javascript脚本来访问cookie。
secure 属性告诉浏览器仅在请求为https的时候发送cookie。
如何防止XSS跨站攻击,让fortify检测通过
不可信数据 不可信数据通常是来自HTTP请求的数据,以URL参数、表单字段、标头或者Cookie的形式。不过从安全角度来看,来自数据库、 *** 服务器和其他来源的数据往往也是不可信的,也就是说,这些数据可能没有完全通过验证。 应该始终对不可信数据保持警惕,将其视为包含攻击,这意味着在发送不可信数据之前,应该采取措施确定没有攻击再发送。由于应用程序之间的关联不断深化,下游直译程序执行的攻击可以迅速蔓延。 传统上来看,输入验证是处理不可信数据的更好办法,然而,输入验证法并不是注入式攻击的更佳解决方案。首先,输入验证通常是在获取数据时开始执行的,而此时并不知道目的地所在。这也意味着我们并不知道在目标直译程序中哪些字符是重要的。其次,可能更加重要的是,应用程序必须允许潜在危害的字符进入,例如,是不是仅仅因为SQL认为Mr. O'Malley名字包含特殊字符他就不能在数据库中注册呢? 虽然输入验证很重要,但这始终不是解决注入攻击的完整解决方案,更好将输入攻击作为纵深防御措施,而将escaping作为首要防线。 解码(又称为Output Encoding) “Escaping”解码技术主要用于确保字符作为数据处理,而不是作为与直译程序的解析器相关的字符。有很多不同类型的解码