Maison  >  Article  >  développement back-end  >  Chaîne PHP échappant aux fonctions associées

Chaîne PHP échappant aux fonctions associées

怪我咯
怪我咯original
2017-07-07 10:19:261842parcourir

Résumé des fonctions liées à l'échappement des caractères PHP. Parfois, pour des raisons de sécurité, nous devons échapper aux chaînes saisies par les utilisateurs

Il y a des choses incorrectes ou peu claires dans l'article. ~

Les configurations et fonctions liées à l'échappement de chaîne PHP sont les suivantes :
1.magic_quotes_runtime
2.magic_quotes_gpc
3.addslashes() et stripslashes()
4.mysql_escape_string()
5.addcslashes() et stripcslashes()
6.htmlentities() et html_entity_decode()
7.htmlspecialchars() et htmlspecialchars_decode()

Lorsque magic_quotes_runtime est activé, la plupart des fonctions de PHP ajoutent automatiquement des barres obliques inverses pour déborder les caractères dans les données importées de l'extérieur (y compris les bases de données ou les fichiers).
Vous pouvez utiliser set_magic_quotes_runtime() et get_magic_quotes_runtime()‍ pour définir et détecter son statut.
Remarque : Ces deux fonctions sont obsolètes dans PHP 5.3.0 ou supérieur, ce qui signifie que cette option est désactivée dans PHP 5.3.0 ou supérieur.

Le paramètre magic_quotes_gpc indique s'il faut automatiquement échapper certains caractères dans les données transmises par GPC (GET, POST, COOKIE
Vous pouvez utiliser get_magic_quotes_gpc() pour détecter son paramètre). .
Si ce paramètre n'est pas activé, vous pouvez utiliser la fonction addslashes() pour ajouter et échapper la chaîne

addslashes()‍ Ajoutez une barre oblique inverse avant le caractère prédéfini spécifié.
Les caractères prédéfinis incluent le guillemet simple ('), le guillemet double ("), la barre oblique inverse () et NUL (caractère NULL).
Ce qui précède est l'explication donnée par W3SCHOOL.COM.CN. Je le pense toujours n'est pas très précis
Car lorsque magic_quotes_sybase=on, il convertit les guillemets simples (') en guillemets doubles ("). Lorsque magic_quotes_sybase=off, il convertit les guillemets simples (') en (')
Stripslashes () fonction Sa fonction est exactement l'opposé de addlashes() Sa fonction est de supprimer l'effet d'échappement.

mysql_escape_string() échappe aux caractères spéciaux dans les chaînes utilisées dans les instructions SQL. ‍
Les spéciaux ici incluent (x00), (n), (r), (), ( '), ("), (x1a)

addcslashes()‍Utilisez l'inversion dans le style de langage C Slash échappe les caractères dans une chaîne. Cette fonction est rarement utilisée par les gens, mais il convient de noter que lorsque vous choisissez d'échapper les caractères 0, a, b, f, n, r, t et v, ils seront convertis en

if(!get_magic_quotes_gpc()) { 
$_GET = daddslashes($_GET); 
$_POST = daddslashes($_POST); 
$_COOKIE = daddslashes($_COOKIE); 
$_FILES = daddslashes($_FILES); 
} 
function daddslashes($string, $force = 1) { 
if(is_array($string)) { 
foreach($string as $key => $val) { 
unset($string[$key]); 
$string[addslashes($key)] = daddslashes($val, $force); 
} 
} else { 
$string = addslashes($string); 
} 
return $string; 
}

‍>> 利用在用户输入或输出时候转义HTML实体以防止XSS漏洞的产生!

今天碰到一个处理文件特殊字符的事情,再次注意到这个问题,在php中:

* 以单引号为定界符的php字符串,支持两个转义\'和\\
* 以双引号为定界符的php字符串,支持下列转义:
    \n 换行(LF 或 ASCII 字符 0x0A(10)) 
    \r 回车(CR 或 ASCII 字符 0x0D(13)) 
    \t 水平制表符(HT 或 ASCII 字符 0x09(9)) 
    \\ 反斜线 
    \$ 美元符号 
    \" 双引号 
    \[0-7]{1,3}               此正则表达式序列匹配一个用八进制符号表示的字符  
    \x[0-9A-Fa-f]{1,2}  此正则表达式序列匹配一个用十六进制符号表示的字符  

举几个例子:

一个包含\0特殊字符的例子:

$str = "ffff\0ffff"; 
echo(strlen($str)); 
echo("\n"); 
for($i=0;$i<strlen($str);$i++)echo("\t".ord($str{$i})); 
echo("\n");

输出结果:
----------------------

9
        102     102     102     102     0       102     102     102     102

替换特殊字符的例子

$str = "ffff\0ffff"; 
$str = str_replace("\x0", "", $str);   
//或者用$str = str_replace("\0", "", $str);  
//或者用$str = str_replace(chr(0), "", $str);  
echo(strlen($str)); 
echo("\n"); 
for($i=0;$i<strlen($str);$i++)echo("\t".ord($str{$i})); 
echo("\n"); 
输出结果:

----------------------
8
        102     102     102     102     102     102     102     102

八进制ascii码例子:

//注意,符合正则\[0-7]{1,3}的字符串,表示一个八进制的ascii码。 
$str = "\0\01\02\3\7\10\011\08\8";  //这里的\8不符合要求,被修正为"\\8" (ascii为92和56) 
echo(strlen($str)); 
echo("\n"); 
for($i=0;$i<strlen($str);$i++)echo("\t".ord($str{$i})); 
echo("\n");

输出结果:
----------------------
11
        0       1       2       3       7       8       9       0       56      92      56

十六进制ascii码例子:

$str = "\x0\x1\x2\x3\x7\x8\x9\x10\x11\xff"; 
echo(strlen($str)); 
echo("\n"); 
for($i=0;$i<strlen($str);$i++)echo("\t".ord($str{$i})); 
echo("\n");

输出结果:
----------------------
10
        0       1       2       3       7       8       9       16      17      255

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn