关于转义

开发过程中需要对用户的输入进行转义,不论是安全地显示用户在表单提交中输入的数据,还是在处理 sql 语句时,进行安全地转义可以有效避免跨站脚本攻击(XSS)和 SQL 注入。

1. 使用 htmlentities() 和 htmlspecialchars()

在处理用户提交的表单数据时,先将用户的输入进行转义,再显示在页面上。

可以使用 htmlentities() 和 htmlspecialchars() 函数将 HTML 实体转换成字符串。最基本的是 htmlspecialchars(),可以转义 4 个字符: < > " 和 &(可以根据可选的参数决定转义的字符)。对于更复杂的编码,需要使用 htmlentities(),可以对任何 HTML 实体进行转换。

例:

<?php

$html = "<script>alert(‘<a href=\"http://baidu.com?user=dee&browser=chrome\">baidu.com</a>‘);</script>";

echo $html,PHP_EOL; //会弹出alert提示框
//浏览器右键查看源代码
//<script>alert(‘<a href="http://baidu.com?user=dee&browser=chrome">baidu.com</a>‘);</script>

echo htmlentities($html),PHP_EOL;
//浏览器右键查看源代码
//<script>alert(‘<a href="http://baidu.com?user=dee&browser=chrome">baidu.com</a>‘);</script>

echo htmlspecialchars($html),PHP_EOL;								//转义双引号 < > &
//浏览器右键查看源代码
//<script>alert(‘<a href="http://baidu.com?user=dee&browser=chrome">baidu.com</a>‘);</script>

echo htmlspecialchars($html, ENT_QUOTES),PHP_EOL;		//转义双引号和单引号 < > &
//浏览器右键查看源代码
//<script>alert(‘<a href="http://baidu.com?user=dee&browser=chrome">baidu.com</a>‘);</script>

echo htmlspecialchars($html, ENT_NOQUOTES),PHP_EOL;	//非单引号和双引号
//浏览器右键查看源代码
//<script>alert(‘<a href="http://baidu.com?user=dee&browser=chrome">baidu.com</a>‘);</script>

  

2. 防止注入攻击,建议使用 PDO 的参数绑定

使用参数绑定时,PDO 会对各个参数加引号和进行转义

例:

<?php

$user = ‘root‘;
$pwd = ‘‘;
try{
	$mysql = new PDO(‘mysql:host=127.0.0.1;port=3306;dbname=test‘, $user, $pwd);
} catch(Exception $e) {
	print ‘Database problem:‘.$e->getMessage();
	die;
}

$st = $mysql->prepare(‘INSERT INTO family (id,name,is_naive) VALUES (?,?,?)‘);
$st->execute(array(‘‘,‘Lee‘,0));

如果不使用参数绑定,则需要自行转义:手动加引号,并且将 SQL 的通配符 _ 和 % 也进行 \ 转义

<?php

$user = ‘root‘;
$pwd = ‘‘;

try{
	$mysql = new PDO(‘mysql:host=127.0.0.1;port=3306;dbname=test‘, $user, $pwd);
} catch(Exception $e) {
	print ‘Database problem:‘.$e->getMessage();
	die;
}

$str = "dee‘s_ books%";

/*使用PDO::quote()自行转义*/
echo $str,"<br />";
// dee‘s_ books%

echo $safe = $mysql->quote($str),"<br />";
// ‘dee\‘s_ books%‘

$safe = strtr($safe, array(‘_‘=>‘\_‘, ‘%‘=>‘\%‘));
echo $safe;
// ‘dee\‘s\_ books\%‘

$st = $mysql->query("SELECT * FROM files WHERE contents LIKE $safe");

注意:不论是自定义转义还是使用 PDO::quote() 转义之前,都要判断服务器是否开启了魔法引号(magic_quotes_gpc 在 PHP 5.4.0 中被移除),如果开启了 magic_quotes_gpc,则关闭或者使用 addlashes() 处理传入的参数(尽量关闭魔法引号):

/* magic_quotes_sybase 为 0 时,addlashes() 对 ‘ " \ 进行 \ 转义 */
/* magic_quotes_sybase 为 1 时,addlashes() 对 ‘ 进行 " 转义 */
if(get_magic_quotes_gpc() && ! ini_get(‘magic_quotes_sybase‘)) {
	$str = stripslashes($str);
} 

$st = $mysql->prepare(‘UPDATE files SET contents = ? WHERE id = 1‘);
$st->execute(array($str));

  

  

  

时间: 2024-12-22 19:15:33

关于转义的相关文章

避免shell脚本SQL语句中 *输出时转义

脚本test.sh内容如下,在 /home/myname/下执行该脚本, 家目录下有文件a.txt,test.log,test.sh #!/bin/bash sql="select * from emp;" echo $sql echo $sql > test.log 执行后结果: select test.sh a.txt test.log from emp; 如何能让sql中的*不转义? 修改为如下: #!/bin/bashsql="select * from emp

Backbone 模板 underscore template默认的转义符&lt;%= %&gt; 与jsp的冲

先定义转义符,因为默认的转义符<%= %> 与jsp的冲突(如果js模板写在jsp页面中)       _.templateSettings = { interpolate : /\{\{(.+?)\}\}/g }; 下面就可以这样写 <script type="text/template" id="detailedBar-template"> <div class='title'> <span class='label'&

利用js将图片地址进行转义

在业务中经常需要将图片从后台获取,然后在前台显示.其中后台存取图片主要分为两种,一种是数据库中获取图片的地址,第二种是存取图片内容的信息.这次主要是前台代码处理第一种情况.数据库存取的是地址,然后根据前台规则,将图片所在的地址进行转义. 主要代码如下: 1 function test(){ 2 var x = "img/2.jpg"; 3 var arr = x.split(""); 4 for(var i=0;i<arr.length;i++){ 5 if(

javascript对HTML的特殊字符的转义与反转义

有时候,我们所查询得到的数据包含有HTML的标签,当我们不希望浏览器解析该标签的时候,我们可以对">""<"进行转义,下面来介绍,"<"">"如何与">""<"进行转义和反转义. //HTML转义  function HTMLEncode(html) {         var temp = document.createElement ("

转义符

前段时间学的知识,为免忘记,一点点整理. 转义符 代表的意义 \" 双引号 \' 单引号 \n 换行符 \t 制表符(相当于按下了Tab键) \\ 斜杠\ 在代码中书写一个斜杠(\)用于改变\后出现字符的意义. " " 代表字符串的开始和结束. \" 普通的双引号字符. 例: Tom said:" Hello !" Console.Write("Tom said :\"Hello!\" ") \t 制表符 例: 你 好 (相当于按下了Tab键) Console.Writeli

【python】正则表达式中的转义问题

encode('string-escape') 解决 比如想匹配'\x0e\x0a'中的'\x'后的内容,这里希望把'\x0e'作为一个字符串,那么其中的\应该被转义. 未加转义的正则: p = '(?<=\x)[0-9A-Za-z]{2}' 直接这样写会报错,需要给\转义,于是变为 p = '(?<=\\x)[0-9A-Za-z]{2}' 但由于使用的时候,会先将p的内容转义,然后匹配,所以又变成了\x和原始数据匹配,又会出错.解决: p = '(?<=\\x)[0-9A-Za-z]{

php 自带的过滤函数和转义函数

函数名 释义 介绍 htmlspecialchars 将与.单双引号.大于和小于号化成HTML格式 &转成&"转成"' 转成'<转成<>转成> htmlentities() 所有字符都转成HTML格式 除上面htmlspecialchars字符外,还包括双字节字符显示成编码等. addslashes 单双引号.反斜线及NULL加上反斜线转义 被改的字符包括单引号 (').双引号(").反斜线 backslash (\) 以及空字符NUL

DotNet的字符转义操作

在项目中使用到字符的转义,现在提供一种字符转义和反转义的操作方法: 1.转义符操作:         /// <summary>         /// 转义符操作         /// </summary>         /// <param name="s"></param>         /// <param name="charToEliminate"></param>      

phalcon: 上下文转义

Phalcon\Escaper 转义特殊的字符 一:字符转义 $maliciousTitle = '</title><script>alert(1)</script>'; $e = new Phalcon\Escaper(); echo $e->escapeHtml($maliciousTitle) 最不安全的情形即是在html标签中插入非安全的数据 我们可以使用escapeHtml方法对这些文本进行转义: $e->escapeHtml('></

基于MVC+EasyUI的Web开发框架经验总结(9)--在Datagrid里面实现外键字段的转义操作

我们在使用EasyUI的时候,很多情况下需要使用到表格控件datagrid,这个控件控件非常强大,使用起来很简洁,但是我在使用中,发现对于一个表里面的外键字段进行转义,并显示引用表的一些名称的操作,却显得比较难以实现,找了很多资料,基本上没有找到对应的解决方案.本文主要介绍我对这种外键字段转义的操作的实现方式,以便供大家参考了解. 1.DataGrid的初始化操作 在了解对内容的解析前,我们先来了解EasyUI里面Datagrid的初始化操作过程,然后逐步进行分析,寻求解决方式. 一般情况下,D