php开发中的一些安全性问题
sql注入攻击
说到安全性问题,首当其冲必定是sql注入问题.所谓的sql注入,就是攻击者在提交数据的时候,会在里面加入一些特殊字符,达到获取数据库访问权限或者破坏数据的目的。
例如,登录功能
sql = "select * from user_table where username=
' "+userName+" ' and password=' "+password+" '";
当用户输入的username = '’or 1 = 1 -- and password='’
sql语句变成
SELECT * FROM user_table WHERE username=
'’or 1 = 1 -- and password='’
条件后面username='' or 1=1 是必定成立的,--是注释后面的sql语句,所以攻击者就轻松绕过了密码验证
那么如何防御sql注入呢,简单的说,就是不要相信任何用户提交过来的数据,具体如下
- 严格按照字段所需的格式进行格式化,比如数字就格式化为数字接受,字符串几格式化为字符串接收。
- 使用addslashes函数来将单引号、双引号、反斜杠、null等字符前面加上斜杆,使其不具有特殊字符意义。
- 使用htmlspecialchars方法来对用户提交的数据进行解析。
- 绑定变量,使用预编译语句防止注入。
xss跨站攻击
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。
防范xss攻击也很简单,一样不要相信用户提交的任何数据,把用户所有的数据都加个htmlspecialchars处理。
csrf跨站伪造请求
跨站伪造请求是攻击者通过一些技术手段欺骗用户去访问曾经认证过的网站,并运行一些操作。可以理解为攻击者盗用了你的身份,以你的名义发送恶意请求。
主要步骤是
- 用户登录网站A,并在本地生成cookie。
- 在不登出网站A的情况下,访问危险网站B。
那么如何防御csrf攻击呢
- 最简单的方法应该是加入页面token了,即每个页面都生成一个随机的token,服务端接收操作指令的时候验证一下。
- 使用cookie hashing的方式,即每个表单都包含同一个随机数,然后在服务端进行hash验证。
- 增加隐藏字段验证,或者表单结构验证。