php程序员都知道,在我们对数据做插入操作时,为了让我们输入的数据在显示时仍然保持最初的形式,就必须对数据进行一些处理。比如:在插入时转义单引号和双引号,以及转义我们输入的html标签:
等。如果不转义直接显示,比如js代码,就会直接在你的页面中运行,而不是以文本的形式显示,这样会给不怀好意的攻击者可趁之机。
在我们对这些html标签、javascript标签、php标签等进行转义时,我们有两种方法采用:
一、在向数据库插入更新数据之前进行转义
二、插入更新数据的时候不转义,在读取的时候进行转义
我们要用到的函数是htmlspecialchars,他会将字符串中的html标签转义成对应的html字符,比如’<’将被转义成’<’。
显然,这两种方法只是在转义顺序上有所不同,那么我到底该采用哪一种呢?
站长认为,这要看您的站点是数据插入压力大,还是数据读取压力大 。如果您的站点读数据操作多于写数据操作,那么应该选择第一种;如果您的站点写数据操作多于读数据操作,那么应该选择第二种。对应一般的站点而而言通常都是读数据操作多于写数据操作,所以多数情况下我们都是选择第一种,即:在对写入、更新数据之前进行转义。
讲完了转义数据的顺序,我们再来了解一下如何显示转义后的数据。
前面已经提到,为了让我们输入的内容保持原样输出,我们应该使用htmlspecialchars函数,那么是不是在任何情况下都必须要用这个函数呢?答案是否定的。通常,当你在
、等标签对中输出带有转义后的html字符的数据时,你确实必须用到这个函数,但是如果你在文本区域【textarea】中输出这些数据时,你不需要用到这个函数,因为textarea为自动为你进行转换。通常,在我们对大文本进行修改时,我们会把它们置于textarea中,那么在你显示的时候你不需要进行任何转义,但是在你执行修改操作时,你必须对你提交的数据进行跟插入数据时几乎一模一样的处理,转义那些危险标签。 还有一点,就是关于空格字符的转义。htmlspecialchars不会转义换行符\r\n号,也就是说如果你插入的数据中包含了换行,当你进行转义显示时,该函数不会显示换行,应此你必须使用nl2br函数,该函数将会帮你显示换行。如果你从数据库读取的转义后的字符串保存在变量$str中,那么你应该使用echo
$newstr=htmlspecialchars(nl2br($str));
$newstr2=nl2br(htmlspecialchars($str));
对于前者,在你输出数据的时候你仍然需要使用echo
标签,该标签将会以文本的形式显示出来,这是因为由于本身的数据包含换行符\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标签进行转化处理的一点拙见,大家有不同看法都可以提出来一起交流。