跨站攻击,即Cross Site Script Execution(通常简写为XSS)是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
攻击者可利用XSS漏洞获取用户cookie,传播蠕虫,篡改页面或进行钓鱼等
对参数做html转义过滤(要过滤的字符包括:单引号、双引号、大于号、小于号,&符号),防止脚本执行。在变量输出时进行HTML ENCODE处理。 PHP应用:可以使用htmlspecialchars对用户参数进行编码 JAVA应用:可以使用org.apache.commons.lang.StringEscapeUtils提供的Escape函数
问题代码示例:
1 2 3 4 | <?php $aa=$_GET[ 'dd' ]; echo $aa. "123" ; ?> |
安全代码示例:
1 2 3 4 | <?php $aa=$_GET[ 'dd' ]; echo htmlspecialchars($aa). "123" ; ?> |
CSRF(Cross-site request forgery跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用
该漏洞可以在用户登录完成后的会话里,让用户执行不知情的操作。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......
一般是使用csrf token的验证机制来保证用户请求的合法性:即在功能请求页面设置csrf token,并在服务端对token进行验证。TAE已经支持了此功能。TAE在渲染页面的时候会默认在所有的POST表单中插入一个含有csrf token的隐藏iuput域:
1 2 3 4 | <form action= "create_user.php" method= "POST" > username:<input type= "text" name= "username" > password:<input type= "text" name= "password" > <input type= "submit" > |
<input name="_tae_token_" type="hidden" value="2Z1KbUmOwwcUEOWvAGBRYA%3D%3D"> </form>
这样提交表单的时候TAE服务端就会进行token验证,如果验证不通过就报错。 所以,ISV同学在编写后台form表单时候,如果是执行写数据库的action,最好将form表单的method改成“POST”,这样就可以使用TAE的安全机制保护应用站点了。当然TAE也支持在js里面使用token验证机制。TAE默认会注入两个全局变量到js环境中:_csrfTokenKey(默认是“_tae_token_”),_csrfTokenValue(token值,是实时生成的),只要将这两个参数加到ajax请求参数中就可以使用token验证机制了:
1 2 3 4 5 6 7 8 9 10 11 | KISSY.io({ type: "POST" , url: "<a rel=" nofollow " class=" external free " style=" text-decoration:none;color:rgb( 102 , 51 , 102 );background-image:url(data:image/png;padding-right:13px;background-position: 100 % 50 %;background-repeat:no-repeat no-repeat; " href=" http: //test.uz.taobao.com/post.php">http://test.uz.taobao.com/post.php</a>", data: "x=1&" + _csrfTokenKey + "=" + _csrfTokenValue, success: function(msg){ alert( "success" ); }, error: function(msg,textStatus){ alert( "error" ); } }); |
见上节说明,这里有个特例: 因为有些站点的搜索框也是用POST表单实现的,而搜索功能一般是只读服务,没必要使用token验证机制,针对这种情况,TAE提供了一种方式去disable这种POST表单的token验证机制,添加一个隐藏的标识input域:
1 2 3 4 | <form action= "create_user.php" method= "POST" > username:<input type= "text" name= "username" > password:<input type= "text" name= "password" > <input type= "submit" > |
<input type="hidden" class="_disable_csrf_token_check_"> </form>
SQL注射是由于程序中对使用到的sql没有做到数据和结构分离导致程序的sql能被恶意用户控制,从而引发的数据库信息泄漏,修改,服务器被入侵等一系列严重后果。
数据库信息泄露或被修改,还有可能威胁服务器的安全。
对程序中使用到的SQL语句,使用变量绑定的方式进行数据和结构的分离。
PHP:
问题代码示例:
1 2 3 4 5 6 7 | <?php $id=$_GET[ 'id' ]; $conn = mysql_connect( "localhost" , "root" , "" ) or die ( "wrong!" ); $sel=mysql_select_db( "mydb" ,$conn); $sql= "select * from user where id = " .id $que=mysql_query($sql,$conn); ?> |
安全代码示例:
1 2 3 4 5 6 7 8 | <?php $id=$_GET[ 'id' ]; $conn = mysql_connect( "localhost" , "root" , "" ) or die ( "wrong!" ); $sel=mysql_select_db( "mydb" ,$conn); $sql= "select * from user where id = :id" $stmt = $conn->prepare($sql); $stmt->execute(array( ':id' =>$id)); ?> |