使用预编译语句。一般来说,防御SQL注入的最佳方式,就是使用预编译语句,绑定变量,但对现有代码的改动量较大。
使用存储过程。使用安全的存储过程可在一定程度上对抗SQL注入,但要注意此种方法并不是100%安全。
严格检查用户数据。对用户传入的数据类型及内容进行严格的检查。对数据类型检查,如利用ID查询时判断是否为整型,输入邮箱时判断邮箱格式,输入时间、日期等必须严格按照时间、时期格式等;对数据内容进行检查,如严格检测用户提交数据中是否包含敏感字符或字符串,是否匹配某种注入规则,严格转义特殊字符等。注意此种方法虽然便于实施,但容易产生误报和漏报,且容易被绕过。
其他。使用安全的编码函数、统一各数据层编码格式(如统一使用UTF-8等)、严格限制数据库用户权限、定期进行代码黑盒白盒扫描、避免将错误信息显示到页面等。
上传目录设置为不可执行。
严格判断文件类型,使用白名单而不是黑名单(注意大小写问题)。需要注意的是一些与Web Server相关的漏洞所造成的问题,如Apache、IIS、Nginx等的文件解析漏洞。
使用随机数改写上传后的文件名和文件路径。
单独设置文件服务器及域名。
跨站脚本攻击(XSS, Cross Site Script)通常指黑客通过“HTML注入”篡改了网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。XSS漏洞可被用于用户身份窃取(特别是管理员)、行为劫持、挂马、蠕虫、钓鱼等。XSS是目前客户端Web安全中最重要的漏洞。
XSS按效果的不同可以分为以下3种。
反射型XSS攻击:页面仅把用户输入直接回显在页面或源码中,需要诱使用户点击才能成功。
存储型XSS攻击:XSS攻击代码会被存储在服务器中,由于用户可能会主动浏览被攻击页面,此种方法危害较大。
DOM型XSS攻击:通过修改页面的DOM节点形成XSS,严格来讲也可划为反射型XSS。
对重要的Cookie字段使用HTTPOnly参数。
检查所有用户可控输入。对所有的输入点进行严格的检查,过滤或拦截所有不符合当前语境的输入。由于无法预期所有可能的输出点语境,此种方法效果较差。
检查所有用户输入的输出点。因为XSS最终攻击是发生在输出点,因此需要分析出用户输入数据的所有输出点的环境,是输入在HTML标签中,还是HTML属性、<script>标签、事件、CSS位置中,针对不同的输出位置,制定不同的转义或过滤规则。
处理富文本。在文章、论坛等需要用到富文本的地方,需要特别注意富文本与XSS的区分,严格禁止所有的危险标签及“事件”,原则上应当使用白名单过滤标签、事件及属性。
辅助验证方法:使用验证码。验证码是对抗CSRF攻击最简单有效的方法,但会影响用户的使用体验,并且不是所有的操作都可以添加验证码防护。因此,验证码只能作为辅助验证方法。
通用防护方法:添加足够随机的csrf_token并每次更新,以防止参数被猜解。使用CSRF_token是目前通用的防护方法。
其他防御措施:验证HTTP Referer,拒绝不安全的来源。但服务器并非在任何情况下都能获取到Referer值。