php让更新可以输入内容,【PHP】浅析php插入、更新数据时对html标签的转化 防注入...

php程序员都知道,在我们对数据做插入操作时,为了让我们输入的数据在显示时仍然保持最初的形式,就必须对数据进行一些处理。比如:在插入时转义单引号和双引号,以及转义我们输入的html标签:

等。如果不转义直接显示,比如js代码,就会直接在你的页面中运行,而不是以文本的形式显示,这样会给不怀好意的攻击者可趁之机。

在我们对这些html标签、javascript标签、php标签等进行转义时,我们有两种方法采用:

一、在向数据库插入更新数据之前进行转义

二、插入更新数据的时候不转义,在读取的时候进行转义

我们要用到的函数是htmlspecialchars,他会将字符串中的html标签转义成对应的html字符,比如’

显然,这两种方法只是在转义顺序上有所不同,那么我到底该采用哪一种呢?

站长认为,这要看您的站点是数据插入压力大,还是数据读取压力大

。如果您的站点读数据操作多于写数据操作,那么应该选择第一种;如果您的站点写数据操作多于读数据操作,那么应该选择第二种。对应一般的站点而而言通常都是读数据操作多于写数据操作,所以多数情况下我们都是选择第一种,即:在对写入、更新数据之前进行转义。

讲完了转义数据的顺序,我们再来了解一下如何显示转义后的数据。

前面已经提到,为了让我们输入的内容保持原样输出,我们应该使用htmlspecialchars函数,那么是不是在任何情况下都必须要用这个函数呢?答案是否定的。通常,当你在

、等标签对中输出带有转义后的html字符的数据时,你确实必须用到这个函数,但是如果你在文本区域【textarea】中输出这些数据时,你不需要用到这个函数,因为textarea为自动为你进行转换。通常,在我们对大文本进行修改时,我们会把它们置于textarea中,那么在你显示的时候你不需要进行任何转义,但是在你执行修改操作时,你必须对你提交的数据进行跟插入数据时几乎一模一样的处理,转义那些危险标签。

还有一点,就是关于空格字符的转义。htmlspecialchars不会转义换行符\r\n号,也就是说如果你插入的数据中包含了换行,当你进行转义显示时,该函数不会显示换行,应此你必须使用nl2br函数,该函数将会帮你显示换行。如果你从数据库读取的转义后的字符串保存在变量$str中,那么你应该使用echo nl2br($str);来确保换行效果。那么,我们能不能在数据插入之前就使用nl2br函数来处理换行呢?但是,考虑到我们需要使用textarea来进行数据更新,这并不是明智的做法。请看下面两种处理方式,它们都视图在数据插入之前转义html标签并且处理换行:

$newstr=htmlspecialchars(nl2br($str));

$newstr2=nl2br(htmlspecialchars($str));

对于前者,在你输出数据的时候你仍然需要使用echo nl2br($str);来显示换行,而且还会多出一个额外的

标签,该标签将会以文本的形式显示出来,这是因为由于本身的数据包含换行符\r\n【通过textarea键入enter键产生】,当你使用nl2br后每一行的前面又多一个

标签并且被转义为文本显示;后者则是正确的,输出数据时你不再需要使用nl2br函数,并且数据格式跟你输入时一模一样,但是这不包括textarea。

当我们更新数据并且把数据显示在textarea中时,会发现它并不是我们输入时候的样子,而是多出一个

字符。不管你使用的是前者还是后者,为什么?因为nl2br函数的作用就是在每一行的开始插入

或者

,而我们通过textarea输入的数据在向服务器发送时就已经包含了换行符\r\n,比如你从textarea输入的数据为:

1234

456

那么php脚本接收后,它的实际代码是1234\r\n456,当你对它使用nl2br函数后,它会变成1234

\r\n456。这时候你再把数据从数据库中取出来放进textarea,当然就会多出一个

,textarea不会直接把

解析成换行,而是直接显示,这显然给我们的更新带来了不便,影响我们更新后保持数据的原始模样。

因此,站长的建议是,不要在数据插入的同时使用nl2br函数进行换行处理。

我们应该遵循如下步骤:

1、插入数据前使用htmlspecialchar函数进行转义【同时必须使用mysql_real_escape_string函数转义单引号和双引号】

2、读取数据时使用nl2br函数处理换行

或者

1、插入数居前不做任何处理【但是必须使用mysql_real_escape_string函数转义单引号和双引号】

2、读取数据时使用nl2br(htmlspecialchars($str))转义数据并且处理换行

以上就是站长关于插入、更新和读取数据时对html标签进行转化处理的一点拙见,大家有不同看法都可以提出来一起交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值