恶意攻击者可以利用跨站脚本攻击做到:
(1) 盗取用户 cookie,伪造用户身份登录。
(2) 让浏览者被迫执行某页面操作,以用户身份向服务器发起请求,达到攻击目的。
(3) 结合浏览器漏洞,下载病毒木马到浏览者的计算机上执行。
(4) 衍生 URL 跳转漏洞。
(5) 让官方网站出现钓鱼页面。
(6) 蠕虫攻击
代码示例
直接在 html 页面展示“用户可控数据”,将直接导致跨站脚本威胁。
复制代码 代码如下:
<?
echo “<span>$newsname</span>”;
echo “<a href=https://www.jb51.net/“$gifurl”>$gifname</a>”;
echo “<input type=text name=user value=https://www.jb51.net/article/\”$username\”>”;
echo “<span style=‘$stylelayout'>”. htmlentities($context).”</span>”;
?>
这几种显示方式,都可能导致用户浏览器把“用户可控数据”当成 JS/VBS 脚本执行,或页面元素被“用户可控数据”插入的页面 HTML 代码控制,从而造成攻击。
解决方案
a) 在 HTML 中显示“用户可控数据”前,应该进行 htmlescape 转义。
复制代码 代码如下:
htmlspecialchars($outputString,ENT_QUOTES);
进行 html 转义应该按照以下列表进行转义:
复制代码 代码如下:
& --> &
< --> <
> --> >
" --> "
' --> '
b) 在 javascript 中输出的“用户可控数据”,需要做 javascript escape 转义。
需要转义的字符包括:
复制代码 代码如下:
/ --> \/
' --> \'
" --> \"
\ --> \\
c) 对输出到富文本中的“用户可控数据”,做富文本安全过滤(允许用户输出 HTML 的情况),防止富文本编辑器中存在脚本性的 script 代码。
SQL 注入(SQL Injection)
安全威胁
当应用程序将用户输入的内容,拼接到 SQL 语句中,一起提交给数据库执行时,就会产生 SQL 注入威胁。由于用户的输入,也是 SQL 语句的一部分,所以攻击者可以利用这部分可以控制的内容,注入自己定义的语句,改变 SQL 语句执行逻辑,让数据库执行任意自己需要的指令。通过控制部分 SQL 语句,攻击者可以查询数据库中任何自己需要的数据,利用数据库的一些特性,可以直接获取数据库服务器的系统权限。本来 SQL 注入攻击需要攻击者对 SQL 语句非常了解,所以对攻击者的技术有一定要求。但是几年前,已经出现了大量 SQL 注入利用工具,可以让任何攻击者,只要点几下鼠标,就能达到攻击效果,这使得 SQL 注入的威胁,极大增加。
SQL注入攻击的一般步骤:
1、攻击者访问有SQL注入漏洞的站点,寻找注入点
2、攻击者构造注入语句,注入语句和程序中的SQL语句结合生成新的sql语句
3、新的sql语句被提交到数据库中执行 处理
4、数据库执行了新的SQL语句,引发SQL注入攻击
代码示例
对于输入检查不充分,导致 SQL 语句将用户提交的非法数据当作语句的一部分来执行。
示例:
复制代码 代码如下:
<?
$id=$_GET['id'];
$name=$_GET['name'];
$sql="select * from news where `id`=$id and `username`='$name' ";
?>
解决方案
a)安全配置与编码方式,PHP 配置选项在 php.ini 文件中指定。下列配置方式能够加强php 的安全性,使应用程序避免受到 sql injection 的攻击。
1) safe_mode=onPHP,将通过文件函数或其目录检查当前脚本的拥有者是否和将被操作的文件的拥有者相匹配 ,当前脚本拥有者和文件操作拥有者不匹配则为违法操作
2) magic_quotes_gpc=on / off,如果该选项被激活,那么请求参数中包含的任何单引号、双引号、反斜线和空字符都会用一个反斜线自动转义。
3) magic_quotes_sybase=on/off,如果改选项被禁用,那么 PHP 就会用一个单引号转义所有的单引号。
验证数字型的变量
$id=(int)$id;
注:PHP6 已经删除 magic quotes 选项
b)使用预处理执行 SQL 语句,对所有传入 SQL 语句中的变量,做绑定。这样,用户拼接进来的变量,无论内容是什么,都会被当做替代符号“?”所替代的值,数据库也不会
把恶意用户拼接进来的数据,当做部分 SQL 语句去解析。示例:
复制代码 代码如下: