相比于直接执行SQL语句,预处理语句有两个主要优点:
预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行) 。
绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句 。
预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性 。
PDO预处理机制
可以使用多种方式实现预处理:指的是在绑定数据进行执行的时候,可以有多种方式 。
预处理语句中为变量
使用数组指定预处理变量
1、准备预处理语句(发送给服务器,让服务器准备预处理语句)
2、发送预处理语句
3、给预处理绑定数据
4、执行预处理:将要操作的数据发送给预处理语句,再执行预处理语句
PDO预处理原理
PDO的预防sql注入的机制也是类似于使用mysql_real_escape_string进行转义,PDO有两种转义的机制,第一种是本地转义,这种转义的方式是使用单字节字符集(PHP<5.3.6)来转义的(单字节与多字节),来对输入进行转义,但是这种转义方式有一些隐患 。隐患主要是:在PHP版本小于5.3.6的时候,本地转义只能转换单字节的字符集,大于5.3.6的版本会根据PDO连接中指定的charset来转义 。
第二种方式是PDO,首先将sql语句模板发送给MysqlServer,随后将绑定的字符变量再发送给Mysqlserver,这里的转义是在MysqlServer做的,它是根据你在连接PDO的时候,在charset里指定的编码格式来转换的 。这样的转义方式更健全,同时还可以在又多次重复查询的业务场景下,通过复用模板,来提高程序的性能 。如果要设置MysqlServer来转义的话,就要首先执行:
原始链接方法:
可见这次PHP是将SQL模板和变量是分两次发送给MySQL的,由MySQL完成变量的转义处理,既然变量和SQL模板是分两次发送的,那么就不存在SQL注入的问题了,但需要在DSN中指定charset属性,如:
示例:
总结:当调用prepare()时,查询语句已经发送给了数据库服务器,此时只有占位符?发送过去,没有用户提交的数据;当调用到execute()时,用户提交过来的值才会传送给数据库,他们是分开传送的,两者独立的,SQL攻击者没有一点机会 。
小结
①、关于sql注入可以使用htmlspecialchars()或addslashes()方法,如果连接mysql,可以用mysql_real_escape_string(),还有在php.ini中配置magic_quotes_gpc开启自动转义的扩展 。
PHP环境打开自动转义,PHP.INI中查看
当magic_quotes_gpc=on时将自动进行转义(默认是on),可在程序中用get_magic_quotes_gpc()检查他的状态
程序为:
②、关于xss攻击可以写一个去处script,frame等代码的方法:
直接用这个函数editor_safe_replace代替htmlspecialchars,既保证安全又能用大部分html代码
所以,对于PHP的安全而言,一定要对用户提交的数据进行过滤校验处理,即先防止SQL注入,后再进行XSS过滤,这两个都需要两手一起抓,且两手都要硬,否则,你的网站将会存在很大的安全风险 。
以上就是php安全问题思考的详细内容,更多请关注其它相关文章!
4=SORT_NATURAL-把每一项作为字符串来处理,使用类似natsort()的自然排序 。
5=SORT_FLAG_CASE-可以结合(按位或)SORT_STRING或SORT_NATURAL对字符串进行排序,不区分大小写 。
定义和用法:
sort()函数对索引数组进行升序排序 。