对PHP安全有帮助的一些函数
安全一直是一个在编程语言中非常值得去关注的方面。在任何一种成熟的编程语言中都有合适的办法来保证程序的安全性,在现代的 WEB 开发中,我们常常需要去处理用户的输入。(那么这时候,问题就来了)有一句编程格言是: 千万不要相信用户输入的安全性。所以呢,今天就介绍一些在PHP 中最常用的为你的代码提供安全保护的方法。
在PHP 中有许多方便的函数可以帮助你免于类似于 SQL注入,XSS攻击。现在让我们来看一下这些能够给你的项目增加安全性的函数吧。但是,请注意,这里只是一些常用的函数的列表,也许他们并不全面,但是我相信他们都是对你的项目是非常有帮助的。
mysql_real_escape_string( string sqlQuery ) :
●转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集。一个非常有用的函数,可以有效地避免 SQL 注入。
以下字符会被转换:
\x00,\n,\r,\,’,”,\x1a
在执行sql语句之前,对要将执行的sql query 使用该函数处理,会将一些危 险扼杀在摇篮中。
但是现在一般在较为成熟的项目中,一般比较推荐使用类似 PDO 这样的数据库持久层来处理所有的数据库操作。他们代表着更为先进的数据库操作处理技术,在安全性,数据读写的速度上逗比那些古老的 mysql_* api 强大了不少。
addslashes() :
在将一些数据插入到数据库中时,这个函数会非常有用,它可以在单引号前加上反斜杠,使得数据在插入时不会出现错误。但是它的使用与php.ini 中的一项设置有关系 — magic_quotes_gpc
1. 对于PHP magic_quotes_gpc=on的情况, 我们可以不对输入和输出数据库的字符串数据作addslashes()和stripslashes()的操作,数据也会正常显示。
如果此时你对输入的数据作了addslashes()处理,那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
2. 对于PHP magic_quotes_gpc=off 的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出,因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
【stripslashes() :删除由 addslashes() 函数添加的反斜杠。】
htmlentities() :
一个非常有用的用来处理输出的函数。它用来将一些可能导致XXS攻击的字符转化为html实体,这些字符在浏览器显示的时候是正常的,但是当你查看它的源代码时,实际上这些特殊字符必不会是他显示的那样,例如
输出:
John & ‘Adams’
源码:
John & 'Adams';
输出:
<>
源码:
<>gt;
编码这些符号,有效地避免了XSS 攻击。
htmlspecialchars():
和 上面的函数是一样的,但是它更常用一些,因为 htmlentities() 是将所有的有在html 标准中定义了的字符转换成他们对应的html实体,这样会是你的输出缺乏易读性(html 实体列表 http://www.w3school.com.cn/tags/html_ref_entities.html)。所以呢,使用 htmlspecialchars() 只是将一些 预定义的字符(就是会导致出现问题的)转换为html实体。例如:
& (和号) 成为 &
” (双引号) 成为 ”
‘ (单引号) 成为 ‘
< (小于) 成为 <
> (大于) 成为 >
所以,在一些项目中,我还是常常使用 htmlspecialchars() 来处理html 的输出的。他在安全这一方面做得更具体一些。
strip_tags(): 一般在输出时使用,将HTML、XML 以及 PHP 的标签剥去。
函数原型: strip_tags(string,allow)
String 代表输入的字符串,allow 代表 不删除的标签,你可以通过 allow 来自定义过需要滤掉的标签
md5() :
一 个将字符串转换为一个32位的哈希值的函数(不能逆向解密),任何一个字符串都能通过这个函数获得一个唯一的32位字符串。但是,现在使用这个函数时,需 要注意有一些数据库记录了大量的md5 值,通过暴力枚举的方式来破解你的密码,所以在使用的时候,你可以先将你的原字符串加一层密,然后再使用md5()哈希,会获得更好的效果。
sha1() :
和md5() 和相似的一个函数,但是他使用不同的算法生成一个 40个字符的字符串。可以在项目中考虑使用。
intval() :
也许你认为这个函数不是一个 security function。但是它在某些情况下可以很好地保护你的code。对从用户收集到的一些数据例如 ID,password,username处理,也许可以消除一些安全隐患,毕竟这里是重灾区。
对PHP安全有帮助的一些函数的更多相关文章
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...
- C++对C的函数拓展
一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...
- 菜鸟Python学习笔记第一天:关于一些函数库的使用
2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...
- javascript中的this与函数讲解
前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...
- 复杂的 Hash 函数组合有意义吗?
很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...
- JS核心系列:浅谈函数的作用域
一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...
- C++中的时间函数
C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...
- Python高手之路【四】python函数装饰器
def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...
随机推荐
- C# 中dataTable中的数据批量增加至数据表中
/// <summary> /// 批量添加 /// </summary> /// <param name="dt"></param> ...
- 乱译文档--开始使用Musca
原文地址:http://aerosuidae.net/musca_start.html aerosuidae.net Musca - Start Using startx Launch it from ...
- 真正菜鸟用教程之WQSG Scrip Export WQSG (脚本导出导入工具,PSP、NDS汉化必备 )
先扫盲WQSG是干什么用的 一些掌机类游戏汉化比方PSP NDS 汉化必备之物 它能够依据字典转换文本 假设你不知道这是啥玩意,快去充电染成茜色的坂道 文本提取(导出)方法 (下文称导出文章) 在导出 ...
- 使用jcrop进行头像剪切
http://www.cnblogs.com/chenssy/archive/2013/05/18/3084985.html http://code.ciaoca.com/jquery/jcrop/ ...
- wpf异常:指定的 Visual 不是此 Visual 的上级问题处理解析
WPF在画线的时候,调用Control0.TransformToAncestor(Control1).Transform(new System.Windows.Point(0, 0))方法转换坐标的时 ...
- CentOS 6.6下PXE+Kickstart无人值守安装操作系统
一.简介 1.1 什么是PXE PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持 ...
- linux删除或隐藏命令历史记录history
1.环境变量添加HISTCONTROL = ignorespace 在命令前面插入空格,这条命令会被 shell 忽略,也就意味着它不会出现在历史记录中.但是这种方法有个前提,只有在你的环境变量 HI ...
- NYOJ 116士兵杀敌(二) 树状数组
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=116 士兵杀敌(一) 数组是固定的,所以可以用一个sum数组来保存每个元素的和就行,但是不 ...
- Freemarker常用技巧(二)
1 list.break指令<#list sequence as item> ...</#list>tem_index:当前变量的索引值.item_has_next:是否存在 ...
- ios10下,手机连接xcode控制台不显示日志,解决办法
按照下面设置: run- > environment variables->添加 OS_ACTIVITY_MODE ,value内容为空