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 kittens here
如果你什么都不做,链接将被显示,点击链接的受害者将得到大量的pop-ups。
如果你的输出是htmlentitiy /htmlspecialchar,那么文本会在那里as-is。如果你strip_tag它,它只是删除标签,并显示它:
pictures of kittens here
有时你可能想要一个混合,在那里留下一些标签,如(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) 。
参考资料