PHP中有这么多函数,我对这些函数的使用感到很混乱。有人使用:htmlspecialchars()
,htmlentities()
,strip_tags()
等
哪一个是正确的,大家通常使用什么呢?
下面这行应该是正确的(如果有更好的请给我建议):
$var = mysql_real_escape_string(htmlentities($_POST['username']));
这一行可以防止MySQL注入和XSS的攻击
顺便说一下,除了XSS攻击和MySQL注入之外,还有什么其他的事情需要注意吗?
总结:
如果我想插入字符串到数据库,我不需要使用htmlentities
,只需使用mysql_real_escape_string
。当显示数据时,使用htmlentities()
,是这样的吗?
总结:
-
mysql_real_escape_string
插入数据库时使用 -
将数据输出到网页时使用的
htmlentities()
-
htmlspecialchars()
用在什么时候? -
strip_tags()
用在什么时候? -
addslashes()
用在什么时候?
有人可以解答上面的疑问吗?
最佳解决思路
mysql_real_escape_string used when insert into database
htmlentities() used when outputting data into webpage
htmlspecialchars() used when??
strip_tags() used when ??
addslashes() used when ??
htmlspecialchars()用在什么时候?
htmlspecialchars与htmlentities大致相同。区别:字符编码。
都编码控制字符,如<
,>
,&
等用于打开标签等。htmlentities还编码其他语言,如变音符号,euro-symbols等字符。如果您的网站是utf,请使用 htmlspecialchars(),否则使用 htmlentities()。
什么时候使用strip_tags()?
htmlspecialchars /实体编码的特殊字符,所以他们显示,但不解释。 strip_tags将其移除。
在实践中,这取决于你需要做什么。
一个例子…你已经编写了一个论坛,并给用户一个文本字段,所以他们可以发布的东西。恶意的只是尝试
pictures of <a href="javascript:void(window.setInterval(function () {window.open('http://evil.com');}, 1000));">kittens</a> here
如果你什么都不做,链接将被显示,点击链接的受害者将得到大量的pop-ups。
如果你的输出是htmlentitiy /htmlspecialchar,那么文本会在那里as-is。如果你strip_tag它,它只是删除标签,并显示它:
pictures of kittens here
有时你可能想要一个混合,在那里留下一些标签,如<b>
(strip_tags可以在那里留下一些标签)。这也是不安全的,所以最好使用一些对xss的完整库
addslashes
引用php手册:
在需要在数据库查询中引用的字符之前返回带反斜杠的字符串
这些字符是单引号(’),双引号(“),反斜杠()和NUL(NULL字节)。 p>addslashes()的一个例子是当你输入数据到数据库。例如,要将O’reilly这个名字插入到数据库中,你需要将它转义出来,它强烈建议使用DBMS特定的转义函数(例如MySQL的mysqli_real_escape_string()或PostgreSQL的pg_escape_string()),但是如果你使用的DBMS没有转义函数,而DBMS使用\来转义特殊字符,你可以使用这个函数。
次佳解决思路
只有在进入系统需要进行编码时才对数据进行编码 – 否则会遇到您想操纵实际数据的情况。
对于SQL注入 – 使用How can I prevent SQL injection in PHP?中描述的绑定变量(它谈论准备好的语句,但它是给予保护的绑定,而不是准备)。
对于XSS – 如果您在指定HTML或文本的位置写入HTML。在生成文档的地方使用htmlentities。我会避免以数据库的形式存储数据(除了可能在write-rare-read-通常系统的CPU性能/磁盘访问时间成为问题 – 然后我将有一个raw_和html_版本的列…或只是使用memcached或类似的)。
如果你让用户输入URL,那么你需要更加小心,因为javascript:do_evil()
是一个有效的URI将被执行(例如作为一个点击链接的href或(在某些浏览器中)刚加载的图像的src) 。