PHP安全性防范方式

<h2>SQL注入</h2> <p>SQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。</p> <h4>防范方式</h4> <ul> <li>使用mysql\_real\_escape\_string(),或者addslashes()过滤数据</li> <li>手动检查每一数据是否为正确的数据类型</li> <li>使用预处理语句并绑定变量</li> <li>使用准备好的预处理语句</li> <li>分离数据和SQL逻辑</li> <li>预处理语句将自动过滤(如:转义)</li> <li>把它作为一个编码规范,可以帮助团队里的新人避免遇到以上问题</li> </ul> <h5>相比于直接执行SQL语句,预处理语句有两个主要优点</h5> <ul> <li>预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。</li> <li>绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。</li> <li>预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。</li> </ul> <h5>而在PHP当中,使用预处理语句主要有两种方法</h5> <ul> <li>使用mysqli数据库</li> <li>使用PDOStatement类对象</li> </ul> <p>查询只需要被解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好(Prepared)之后,数据库就会分析,编译并优化它要执行查询的计划。对于复杂查询来说,如果你要重复执行许多次有不同参数的但结构相同的查询,这个过程会占用大量的时间,使得你的应用变慢。通过使用一个预处理语句你就可以避免重复分析、编译、优化的环节。简单来说,预处理语句使用更少的资源,执行速度也就更快。</p> <h5>服务器的措施</h5> <ul><li>关于SQL注入,不得不说的是现在大多虚拟主机都会把magic\_quotes\_gpc选项打开,在这种情况下所有的客户端GET和POST的数据都会自动进行addslashes处理,所以此时对字符串值的SQL注入是不可行的,但要防止对数字值的SQL注入,如用intval()等函数进行处理。但如果你编写的是通用软件,则需要读取服务器的magic\_quotes\_gpc后进行相应处理。</li></ul> <h2>XSS攻击</h2> <p>XSS(跨站点脚本攻击)是一种攻击,由用户输入一些数据到你的网站,其中包括客户端脚本(通常JavaScript)。如果你没有过滤就输出数据到另一个web页面,这个脚本将被执行。</p> <h4>防范方式</h4> <p>是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数 。</p> <p>在使用htmlspecialchars()函数的时候注意第二个参数, 直接用htmlspecialchars($string) 的话,第二个参数默认是ENT\_COMPAT,函数默认只是转化双引号(“), 不对单引号(‘)做转义.</p> <p>所以,htmlspecialchars函数更多的时候要加上第二个参数, 应该这样用: htmlspecialchars($string,ENT\_QUOTES).当然,如果需要不转化如何的引号,用htmlspecialchars($string,ENT\_NOQUOTES).</p> <p>另外, 尽量少用htmlentities, 在全部英文的时候htmlentities和htmlspecialchars没有区别,都可以达到目的.但是,中文情况下, htmlentities却会转化所有的html代码,连同里面的它无法识别的中文字符也给转化了。</p> <p>htmlentities和htmlspecialchars这两个函数对 '之类的字符串支持不好,都不能转化, 所以用htmlentities和htmlspecialchars转化的字符串只能防止XSS攻击,不能防止SQL注入攻击.</p> <h2>代码注入</h2> <p>代码注入是利用计算机漏洞通过处理无效数据造成的。问题出在,当你不小心执行任意代码,通常通过文件包含。写得很糟糕的代码可以允许一个远程文件包含并执行。如许多PHP函数,如require可以包含URL或文件名</p> <h4>防范方式</h4> <ul> <li>过滤用户输入</li> <li>在php.ini中设置禁用allow\_url\_fopen和allow\_url\_include。这将禁用require/include/fopen的远程文件。</li> </ul> <p>文章参考:<br><a href="https://blog.csdn.net/tim\_phper/article/details/52326648" rel="nofollow noreferrer">https://blog.csdn.net/tim\_php...</a><br><a href="https://blog.csdn.net/come\_on\_air/article/details/73330728" rel="nofollow noreferrer">https://blog.csdn.net/come\_on...</a><br><a href="https://www.cnblogs.com/wt645631686/p/6867651.html?utm\_source=itdadao&amp;utm\_medium=referral" rel="nofollow noreferrer">https://www.cnblogs.com/wt645...</a></p>

原文地址:https://segmentfault.com/a/1190000016915271

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

sql注入

反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o

java持久层框架mybatis如何防止sql注入

sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如“or‘1’’1’”这样的语句,有可能入侵参数校验不足的应用程序。所以在我们的应用中需要做一些工作,来防备这样的攻击方式。在一些安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为存储过程这样的方式,来防止sql注入,这当然是一种很安全

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''

PHP安全性防范方式 - HelloWorld