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

2022-08-30 09:39:52

我有点困惑,PHP中有很多函数,有些使用这个,有些使用那个。有些人使用:,,等htmlspecialchars()htmlentities()strip_tags()

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

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

$var = mysql_real_escape_string(htmlentities($_POST['username']));

这条线可以防止MySQL注入和XSS攻击??

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

编辑

总结:

如果我想将字符串插入数据库,我不需要使用,只需使用.显示数据时,请使用 ,这是你们的意思吗?htmlentitiesmysql_real_escape_stringhtmlentities()

总结:

  • mysql_real_escape_string插入数据库时使用
  • htmlentities()在将数据输出到网页时使用
  • htmlspecialchars()何时使用?
  • strip_tags()何时使用?
  • addslashes()何时使用?

有人可以填写问号吗?


答案 1
  • mysql_real_escape_string插入数据库时使用
  • htmlentities()在将数据输出到网页时使用
  • htmlspecialchars()何时使用?
  • strip_tags()何时使用?
  • addslashes()何时使用?

htmlspecialchars() 使用的时候?

htmlspecialchars与 大致相同。区别:字符编码。htmlentities

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

strip_tags() 何时使用?

htmlspecialchars / entities对特殊字符进行编码,以便显示它们但不进行解释。 删除它们。strip_tags

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

例如:您已经编写了一个论坛,并为用户提供了一个文本字段,以便他们可以发布内容。恶意的只是尝试:

pictures of <a href="javascript:void(window.setInterval(function () {window.open('http://evil.example');}, 1000));">kittens</a> here

如果您不执行任何操作,则将显示该链接,并且单击该链接的受害者将获得大量弹出窗口。

如果你的 htmlentity/htmlspecialchary 你的输出,文本将按原样存在。如果您strip_tag它,它只会删除标签并显示它:

pictures of kittens here

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

加号

引用旧版本的PHP手册

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

addslashes() 的一个示例是当您将数据输入数据库时。例如,要将名称 O'reilly 插入到数据库中,您需要对其进行转义。强烈建议使用特定于DBMS的转义函数(例如,mySQL的mysqli_real_escape_string()或PostgreSQL的pg_escape_string()),但是如果您使用的DBMS没有转义函数,并且DBMS使用\来转义特殊字符,则可以使用此函数。

当前版本的措辞不同。


答案 2

我想到了这个快速清单:

  • 始终使用HTTPS,没有HTTPS,您的网站是完全未加密的。不,客户端加密内容并发送它们将不起作用,请考虑一下。无效的 HTTPS 证书也会使您容易受到 MITM 攻击。如果您买不起证书,只需使用Let's Encrypt即可。
  • 始终在 PHP 代码的任何输出(即或包含用户输入)上使用 htmlspecialchars()。大多数模板引擎可以帮助您轻松做到这一点。
  • 在您的中使用仅 HTTP 标志,以防止脚本访问您的 Cookiephp.ini
  • 防止与会话相关的问题
    • 切勿在cookie外部公开用户的PHPSESSID(会话ID),如果有人知道其他人的会话ID,他们可以简单地使用它来登录他们的帐户
    • 非常小心该功能,可能显示一点警告。Remember me
    • 在用户登录时刷新会话 ID(或任何适当的内容)
    • 超时非活动会话
  • 永远不要信任cookie,它可以随时由脚本/用户更改,删除,修改和创建
  • 防止与 SQL 相关的问题
    • 始终使用预准备语句。预准备语句导致单独传递用户输入并阻止 SQL 注入
    • 使代码在失败时引发异常。有时,SQL Server 可能由于某种原因而关闭,默认情况下会忽略该错误等库,并在日志中记录警告。这会导致从数据库获取的变量为 null,具体取决于您的代码,这可能会导致安全问题。PDO
    • 一些库喜欢模拟预准备语句。将其关闭。PDO
    • 在数据库中使用编码,它允许您存储几乎任何字符并避免与编码相关的攻击UTF-8
    • 切勿将任何内容与查询连接起来。像这样的事情几乎意味着你有SQL注入的巨大安全风险。$myquery = "INSERT INTO mydb.mytable (title) VALUES(" . $user_input . ")"
  • 将上传的文件存储在随机的无扩展名文件名中。如果用户上传了文件扩展名的文件,则每当代码加载该文件时,它就会执行该文件,并允许用户执行一些后端代码.php
  • 确保您不容易受到CSRF攻击
  • 始终更新您的 PHP 副本,以确保最新的安全补丁和性能改进

推荐