当前位置: 首页>>技术问答>>正文


在PHP中,如何防止代码注入攻击?

qingchuanTR 技术问答 , , 去评论

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字节)。

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) 。

注入攻击

参考资料

本文由《纯净的天空》出品。文章地址: https://vimsky.com/article/3741.html,未经允许,请勿转载。