首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在PHP中防止代码注入攻击?

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

Stack Overflow用户
提问于 2009-07-30 11:04:06
回答 8查看 95.6K关注 0票数 58

我有点困惑,PHP里的函数太多了,有的用这个,有的用那个。有些人使用:htmlspecialchars()htmlentities()strip_tags()

哪一个是正确的,你们通常使用什么?

这是正确的吗(如果有的话,建议我一个更好的):

代码语言:javascript
复制
$var = mysql_real_escape_string(htmlentities($_POST['username']));

这行可以防止MySQL注入和XSS攻击吗??

顺便说一下,除了XSS攻击和MySQL注入之外,我还需要注意其他事情吗?

编辑

结论:

如果我想在数据库中插入字符串,我不需要使用htmlentities,只需要使用mysql_real_escape_string。当显示数据时,使用htmlentities(),这就是你们的意思吗??

总结:

插入到database

  • htmlentities()时使用
  • mysql_real_escape_string将数据输出到webpage
  • htmlspecialchars()时使用when?
  • strip_tags()使用when?
  • addslashes()在以下情况下使用?

谁能填一下问号?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-07-30 13:02:03

插入到database

  • htmlentities()时使用
  • mysql_real_escape_string将数据输出到webpage
  • htmlspecialchars()时使用when?
  • strip_tags()使用when?
  • addslashes()在以下情况下使用?

htmlspecialchars()在什么时候使用?

htmlspecialcharshtmlentities大致相同。区别在于:字符编码。

两者都编码控制字符,如<>&等,用于开始标记等。htmlentities还编码来自其他语言的字符,如变音符号、欧元符号等。如果您的网站是UTF,请使用htmlspecialchars(),否则请使用htmlentities()

什么时候使用strip_tags()?

htmlspecialchars / entities对特殊字符进行编码,因此可以显示这些字符,但不对其进行解释。strip_tags会删除它们。

在实践中,这取决于您需要做什么。

举个例子:你编写了一个论坛,并给用户一个文本字段,这样他们就可以发布东西了。恶意用户只需尝试:

代码语言:javascript
复制
pictures of <a href="javascript:void(window.setInterval(function () {window.open('http://evil.com');}, 1000));">kittens</a> here

如果你什么都不做,这个链接就会被显示出来,受害者点击这个链接就会看到很多弹出窗口。

如果htmlentity/ will指定输出字符,则文本将按原样显示。如果你strip_tag它,它简单地删除标签并显示它:

代码语言:javascript
复制
pictures of kittens here

有时你可能想要一个混合的,留下一些标签在那里,如<b> (strip_tags可以在那里留下某些标签)。这也是不安全的,所以最好使用一些成熟的库来对付XSS。

地址斜杠

引用old version of the PHP manual

返回一个字符串,在数据库查询等需要引用的字符前面有反斜杠。这些字符是单引号(')、双引号(")、反斜杠()和NUL ( NULL字节)。

addslashes()的一个示例用法是在数据库中输入数据时。例如,要将名称O‘’reilly插入到数据库中,您需要对其进行转义。强烈建议使用数据库管理系统特定的转义函数(例如,用于MySQL的mysqli_real_escape_string()或用于PostgreSQL的pg_escape_string() ),但如果您正在使用的数据库管理系统没有转义函数,而数据库管理系统使用\来转义特殊字符,则可以使用此函数。

current version的用法有所不同。

票数 71
EN

Stack Overflow用户

发布于 2016-06-16 09:24:18

我想到了这个快速清单:

  • Always使用HTTPS,没有HTTPS,你的站点就是完全未加密的。不,客户端加密并发送它们是行不通的,想想看。无效的证书还会使您容易受到 的攻击。如果你负担不起使用 对PHP代码的任何输出进行加密,也就是说,或者包含用户输入,只需使用Let's Encrypt即可。大多数模板引擎都可以帮助你轻松地做到这一点。cookie使用HTTP-only标志来防止脚本访问cookies
  • Prevent会话相关的问题,并在
  • php.ini之外暴露用户的会话ID (,会话ID)。如果任何人知道别人的会话ID,他们可以简单地使用它登录到自己的帐户
  • 要非常小心地使用Remember me函数,在用户登录时显示一个小小的警告maybe.
  • Refresh会话ID (或任何appropriate)
  • Timeout inactive sessions

SQL永远不要信任cookie,脚本/用户可以在任何与moment

  • Prevent 相关的问题和use moment
  • Prevent
  • 中更改、删除、修改和创建cookie。准备好的语句导致用户输入被单独传递,并防止SQL Injection
  • Make您的代码在失败时抛出异常。有时,您的SQL server可能会因为某种原因而关闭,默认情况下,PDO等库会忽略该错误,并在日志中记录一个警告。这会导致你从数据库获取的变量为null,这取决于你的代码,这可能会导致一个安全问题。
  • 一些库,如PDO,模拟预准备语句。
  • 在您的数据库中使用UTF-8编码,它允许您存储几乎任何字符,并避免与编码相关的UTF-8将任何内容连接到您的查询。像$myquery = "INSERT INTO mydb.mytable (title) VALUES(" . $user_input . ")"这样的东西很大程度上意味着SQL injection.

存在巨大的安全风险。

  • 以随机、无扩展名的文件名存储上传的文件。如果用户上传了一个带有PHP文件扩展名的文件,那么每当你的代码加载该文件时,它就会执行它,并使用户能够执行一些后端代码。为了确保最新的安全补丁和性能improvements

,请确保你的.php副本不容易受到CSRF attack.

  • Always的攻击
票数 10
EN

Stack Overflow用户

发布于 2009-07-30 11:09:06

只在需要对数据进行编码的地方对数据进行编码-否则,您将遇到需要处理真实数据的情况。

对于SQL注入-使用How can I prevent SQL injection in PHP?中描述的绑定变量(它讨论的是预准备语句,但它是为您提供保护的绑定,而不是准备)。

对于XSS -如果在指定HTML或文本的位置写入HTML。在生成文档的位置使用htmlentities。我将避免以这种形式将数据存储在数据库中(除非在写入极少、读取频繁的系统中可能出现CPU性能/磁盘访问时间和问题-那么我将拥有一个raw_和一个html_版本的列…或者只使用memcached或类似的)。

如果您让用户输入URL,那么您需要更加小心,因为javascript:do_evil()是将执行的有效URI (例如,作为被点击链接的href,或者(在某些浏览器中)刚刚加载的图像的src )。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1205889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档