1. 过滤影响SQL正常运行的字符。
1) 过滤影响MySQL正常运行的字符。
当需要把用户输入的内容(有可能包含单引号、双引号 、反斜线、空字元 NULL )代入到mysql的语句 中执行时,应该把php.ini中的magic_quotes_gpc项设成On。
如果php.ini中的此项设成Off时,也可用php的函数addslashes()达到相同的目的,但这两种手段不能同时使用,否则会出现重复替换,出现错误。
样例:
- <?php
- if (get_magic_quotes_gpc()) {
- $content=$_POST["content"];
- } else {
- $content=addslashes($_POST["content"]);
- }
- ?>
当然,如果php.ini中的magic_quotes_gpc项为On,但有时又不想转义某项的特殊字符,可以使用stripslashes()去掉其中的 \
使用get_magic_quotes_gpc特别需要注意的一点是,get_magic_quotes_gpc对$_REQUEST的变量不起作用,也就是说即使get_magic_quotes_gpc的状态为开启,$_REQUEST的变量也不会自动转义
2) 过滤影响MSSQL正常运行的字符。
当需要把用户输入的内容(有可能包含单引号)代入到mssql的语句中执行时,应该把php.ini中的magic_quotes_sybase项设成On,此时magic_quotes_gpc项不再生效。
如果php.ini中的此项设成Off时,php中并没有合适的函数达到相同的目的,只能使用字符串替换函数来达到此目的。
样例:
- <?php
- $content=str_replace("'","''"$_POST["content"]);
- ?>
现在PHP既要访问mysql又要访问mssql,php.ini中的设置不能兼顾两种数据库,所以只对mysql做了相应设置。
2. 应对用户输入包含SQL语句的一个措施。
以下两种SQL写法都比较普遍,但安全程度是不同的,当用户提交的$id='1 and 1=2 union select ...'时第一种就会显示出不该显示的数据,而第二种就相对安全些。
- Select * FROM article Where articleid=$id
- Select * FROM article Where articleid='$id'
3. 防止用户输入的内容因包含html标签或javascript而影响页面的正常显示。
可以用htmlspecialchars()过滤其中的 & " < >
- $content=htmlspecialchars($content);
4. 当页面要显示的内容包含回车换行时,可以使用nl2br()来达到页面上换行的效果。
