background image

PHP 教程:插入、更新数据对 html 标签的转化和防注

php 程序员都知道,在我们对数据做插入操作时,为了让我们输入的数据在显示时仍然
保持最初的形式,就必须对数据进行一些处理。比如:在插入时转义单引号和双引号,以
及转义我们输入的 html 标签:scriptscript,空格,p 等。如果不转义直接显示,比如 js
代码,就会直接在你的页面中运行,而不是以文本的形式显示,这样会给不怀好意的攻
击者可趁之机。
在我们对这些 html 标签、javascript 标签、php 标签等进行转义时,我们有两种方法采
用:
一、在向数据库插入更新数据之前进行转义
二、插入更新数据的时候不转义,在读取的时候进行转义
我们要用到的函数是 htmlspecialchars,他会将字符串中的 html 标签转义成对应的
html

’’

字符,比如 将被转义成 <’。

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

 

站长认为,这要看您的站点是数据插入压力大,还是数据读取压力大 。如果您的站点读
数据操作多于写数据操作,那么应该选择第一种;如果您的站点写数据操作多于读数据
操作,那么应该选择第二种。对应一般的站点而而言通常都是读数据操作多于写数据操作,
所以多数情况下我们都是选择第一种,即:在对写入、更新数据之前进行转义。
讲完了转义数据的顺序,我们再来了解一下如何显示转义后的数据。
前面已经提到,为了让我们输入的内容保持原样输出,我们应该使用 htmlspecialchars
函数,那么是不是在任何情况下都必须要用这个函数呢?答案是否定的。通常,当你在
pp、divdiv 等标签对中输出带有转义后的 html 字符的数据时,你确实必须用到这个函数,
但是如果你在文本区域【textarea】中输出这些数据时,你不需要用到这个函数,因为
textarea 为自动为你进行转换。通常,在我们对大文本进行修改时,我们会把它们置于
textarea 中,那么在你显示的时候你不需要进行任何转义,但是在你执行修改操作时,
你必须对你提交的数据进行跟插入数据时几乎一模一样的处理,转义那些危险标签。
还有一点,就是关于空格字符的转义。htmlspecialchars 不会转义换行符 rn 号,也就是
说如果你插入的数据中包含了换行,当你进行转义显示时,该函数不会显示换行,应此你
必须使用 nl2br 函数,该函数将会帮你显示换行。如果你从数据库读取的转义后的字符串
保存在变量$str 中,那么你应该使用 echo nl2br($str);来确保换行效果。那么,我们能
不能在数据插入之前就使用 nl2br 函数来处理换行呢?但是,考虑到我们需要使用
textarea 来进行数据更新,这并不是明智的做法。请看下面两种处理方式,它们都视图
在数据插入之前转义 html 标签并且处理换行:
 
$newstr=htmlspecialchars(nl2br($str));
$newstr2=nl2br(htmlspecialchars($str));
对于前者,在你输出数据的时候你仍然需要使用 echo nl2br($str);来显示换行,而且还