web安全知识
参考文章 : https://www.mudoom.com/php%E5%AE%89%E5%85%A8%E7%BC%96%E7%A0%81/
SQL注入
造成sql注入的原因是因为程序没有过滤用户输入的内容, 本质上是在执行sql时数据和语句混淆,下面举一个例子:
万能密码和万能用户名
正常写法 : select * from table_name where username = 'admin' and password = 'admin'
万能密码 : 利用输入表单构造sql, select * from table_name where username = 'admin' and password = 'admin' or 1 = 1, 要防止非常简单, 对密码进行md5加密比对即可
万能用户名 : select * from table_name where username = 'admin' or 1 = 1 and password = 'admin' , 绝对不要相信用户输入的任何数据。 利用addslashes()转义, 对单引号, 双引号, NULL, 反斜杠(\)进行转义.
预防数据库攻击正确做法: 关闭所有错误提示!!!
1. 不能使用mysqli或PDO时, 可以临时使用addslashes() 转义, 前提是数据库为utf-8编码, 并且参数位于''内
2. 使用mysqli或pdo预编译处理sql, 原理是命令与参数分两次发送到MYSQL, 这样MYSQL就能识别参数与命令
$username = 'root';
$password = '1234abcd';
$driver_options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
);
$pdo = new PDO($dsn, $username, $password, $driver_options);
//1.编译统一的结构
$sql = "insert into team values (null, :team_name)";
$stmt = $pdo->prepare($sql);
$data_list = array(
array('name'=>'国安'),
array('name'=>'绿地'),
array('name'=>'恒大'),
array('name'=>'建业'),
array('name'=>'鲁能'),
array('name'=>'申花'),
);
foreach($data_list as $row) {
//2.绑定数据到中间编译结果
$stmt->bindValue(':team_name', $row['name']); //3.执行
$result = $stmt->execute();
var_dump($result);
}
3.自己写一个prepared(不推荐)
function prepare( $query, $args ) {
if ( is_null( $query ) )
return;
// This is not meant to be foolproof --
but it will catch obviously incorrect usage.
if ( strpos( $query, '%' ) === false ) {
_doing_it_wrong( 'wpdb::prepare' ,
sprintf ( __( 'The query argument of %s
must have a placeholder.' ), 'wpdb::prepare()' ), '3.9' );
}
$args = func_get_args();
array_shift( $args );
// If args were passed as an array (as in vsprintf), move them up
if ( isset( $args[ 0] ) && is_array( $args[0]) )
$args = $args [0];
$query = str_replace( "'%s'", '%s' , $query );
// in case someone mistakenly already singlequoted it
$query = str_replace( '"%s"', '%s' , $query );
// doublequote unquoting
$query = preg_replace( '|(?<!%)%f|' , '%F' , $query );
// Force floats to be locale unaware
$query = preg_replace( '|(?<!%)%s|', "'%s'" , $query );
// quote the strings, avoiding escaped strings like %%s
array_walk( $args, array( $this, 'escape_by_ref' ) );
return @ vsprintf( $query, $args );
}
XSS攻击
https://segmentfault.com/a/1190000005032978
反射型xss 和 存储型xss
主要目的:
- 盗取cookie, 获取敏感信息
- 冒充他人进行操作, 如加好友, 购物, 发消息...
- 在访问量极大的页面的xss可以攻击一些小网站,达到DDos的效果
- ...
防御
坚决不相信任何用户的输入。
- 在输出时使用htmlspecialchars()过滤
- 针对链接类型(如图片、超链等)的输出也可使用htmlspecialchars进行安全过滤,但如果变量是整个URL则应检查这个变量是否以http或https开头,如果不是则自动补齐避免出现伪协议类的XSS攻击。(例子:<a href=”data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTs8L3NjcmlwdD4=”>xss</a>)
- 富文本编辑器采用白名单, 再针对可能出现xss的标签进行安全过滤
CSRF
https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/
攻击者伪造请求, 举个例子:
a.com 有一个标签<img src=”http://b.com?action=del&id=1″>, 用户请求a.com, 将会产生一个请求 :http://b.com?action=del&id=1,, 浏览器会以当前用户在b.com上的身份(cookie信息)发起删除操作
防御:
1. 对于敏感操作使用随机token验证。 token必须足够随机,验证后立即删除,尽量以post提交防止泄露, 原理: 可以在服务端的session里面存一个token, 然后在用户提交的表单中也带一个token, 这个token不存在cookie中, 攻击者无法伪造此token, 也就攻击失败了。 通常做法是在页面加载时遍历整个dom树,在a和form标签后面加上token.
2.验证HTTP Referer字段, 该字段记录了http请求来源地址, 但是不能确保万无一失,依赖于第三方浏览器。
3.在HTTP头中自定义属性并验证
文件上传漏洞
白名单上传, 结合MIME和后缀检查文件类型
使用随机文件名保存上传的文件,避免因终止符造成的文件名中断
跨域
浏览器同源策略限制, 不能访问其他域上的资源, 最主流的解决办法是jsonp, 原理 :
客户端
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
function get(data){
alert(data);
}
</script>
<script src="http://about.tw1996.com/jsonp.php?callback=get">
</script>
</head>
<body> </body>
</html>
服务端
<?php $callback = $_GET['callback']; echo $callback."(111)";
web安全知识的更多相关文章
- web前端知识体系总结
1. 前言 大约在几个月之前,让我看完了<webkit技术内幕>这本书的时候,突然有了一个想法.想把整个web前端开发所需要的知识都之中在一个视图中,形成一个完整的web前端知识体系,目的 ...
- 自己总结的web前端知识体系大全【欢迎补充】
1. 前言 大约在几个月之前,让我看完了<webkit技术内幕>这本书的时候,突然有了一个想法.想把整个web前端开发所需要的知识都之中在一个视图中,形成一个完整的web前端知识体系,目的 ...
- WEB前端知识体系脑图
说在开始的话: 我上大学那会,虽说主要是学Java语言,但是web前端也稍微学了一些,那时候对前端也没多在意,因为涉入的不深,可以搞一个差不多可以看的界面就可以了,其他也没过多在意. 因为稍微了解一点 ...
- web前端知识体系大全
1. 前言 大约在几个月之前,让我看完了<webkit技术内幕>这本书的时候,突然有了一个想法.想把整个web前端开发所需要的知识都之中在一个视图中,形成一个完整的web前端知识体系,目的 ...
- web前端知识体系小结(转)
1. 前言 大约在几个月之前,让我看完了<webkit技术内幕>这本书的时候,突然有了一个想法.想把整个web前端开发所需要的知识都之中在一个视图中,形成一个完整的web前端知识体系,目的 ...
- web 安全知识
目录 背景最简单的 Web 物理架构攻击方式总览Web 软件安全攻击防护浏览器安全攻击Cookie 假冒隐藏变量修改跨站脚本攻击服务器安全攻击缓冲区溢出认证逃避非法输入授权逃避SQL 注入异常敏感信息 ...
- WEB相关知识和Tomcat服务器
WEB相关知识 1.Internet上供外界访问的Web资源分为: 静态web资源:指web页面中供人们浏览的数据始终是不变的. 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间 ...
- Web基础知识和技术
WEB是一个外延广泛的概念,不单单指网站,乌徒帮专注拥有WEB界面的网站开发,帮助初学者或已经进入开发的朋友们提供参考讨论平台,然而并不一定能将所有的WEB知识讲全讲透,只是能满足初涉者的建站需求,能 ...
- (1)写给Web初学者的教案-----学习Web的知识架构
1:学习Web的知识架构 前文中我们简单的介绍了一些关于Web的基本知识,这里任老师再次强调一下凡是用浏览器打开的网站我们就称之为Web应用程序(B/S结构).除此之外其它需要下载安装的软件或是手机 ...
- Web前端知识体系精简
Web前端技术由html.css和javascript三大部分构成,是一个庞大而复杂的技术体系,其复杂程度不低于任何一门后端语言.而我们在学习它的时候往往是先从某一个点切入,然后不断地接触和学习新的知 ...
随机推荐
- 前端打印功能实现及css设置
首先是使用下边代码,实现js局部打印功能.参数dom为需要打印的节点,为了保证页面功能的单一性,最好弹出一个新的预览页面完成打印功能. function print(dom){ var body = ...
- IP地址分类、私有地址、子网、子网掩码
IP地址分类介绍 这里讨论IPv4,IP地址分成了A类.B类.C类.C类.E类,如下图所示: 解释: A类以0开头,网络地址有7位,主机地址有24位,举例:A类地址:0 10000000 000000 ...
- LInux50个基本命令
cd:(切换)vim:(创建文件) vi:编辑文件bc:(计算器)quit:退出计算器mkdir:(创建目录) mkdir -p:递归建立目录rmdir:(删除目录)arch:(显示处理器X8 ...
- 设计模式--模板方法模式C++实现
模板方法模式C++实现 1定义 定义一个操作的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 实现方案:将算法/逻辑框架放在抽象基类中,并定义好 ...
- MySQL相关错误汇总
Eroor 1 描述: 在启动mysql的时候出现如下问题:"ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' ...
- restframework api(基础2)
一 socket简介 1 最简单的socket #################server import socket ip_port = ('127.0.0.1',9997) sk = sock ...
- Singleton单例类模式
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- C++设计模式之-外观模式
意图: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一系统更加容易使用. 适用性: 1.在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,就需要 ...
- PHP回调函数call_user_func()和call_user_func_array()的使用
call_user_func():把第一个参数作为回调函数调用 用法:call_user_func ( callable $callback [, mixed $parameter [, mixed ...
- Linux驱动入门——构建和运行模块
Hello world模块 本文介绍如何向内核中添加一个hello模块.该模块的功能是在模块加载时,向系统日志输出"hello world\n" 在模块卸载时输出"Goo ...