当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何防止PHP中的代码注入攻击?》经验,为你挑选了3个好方法。

我有点困惑,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() 用的时候?

有人可以填写问号吗?



1> stefs..:

mysql_real_escape_string 插入数据库时​​使用

htmlentities() 在将数据输出到网页时使用

htmlspecialchars() 用的时候?

strip_tags() 用的时候?

addslashes() 用的时候?

htmlspecialchars()用的时候?

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

像两个编码控制字符<,>,&等等用于打开标签等htmlentities也编码从像元音变音,欧元符号和的其他文字字符.如果您的网站是UTF,请使用htmlspecialchars(),否则请使用htmlentities().

strip_tags()用的时候?

htmlspecialchars/ entities编码特殊字符,因此它们被显示但不被解释.strip_tags删除它们.

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

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

pictures of kittens here

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

如果您输出htmlentity/htmlspecialchar,则文本将按原样存在.如果你strip_tag它,它只是删除标签并显示它:

pictures of kittens here

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

和addslashes

引用旧版本的PHP手册:

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

使用addslashes()的一个示例是在将数据输入数据库时​​.例如,要将名称O'reilly插入数据库,您需要将其转义.强烈建议使用DBMS特定的转义函数(例如MySQL的mysqli_real_escape_string()或PostgreSQL的pg_escape_string()),但如果您使用的DBMS没有转义函数且DBMS使用\来转义特殊字符,那么可以使用这个功能.

在目前的版本是不同的措词.



2> OverCoder..:

我想到了这个快速清单:

始终使用HTTPS,不使用HTTPS,您的网站完全未加密.不,客户端加密和发送它们将无法正常工作,请考虑一下.无效的HTTPS证书也使您容易受到MITM攻击.如果您买不起证书,只需使用Let's Encrypt.

始终使用htmlspecialchars()PHP代码的任何输出,即包含用户输入.大多数模板引擎可以帮助您轻松完成.

在您的帐户中使用仅HTTP标志,php.ini以防止脚本访问您的cookie

防止与会话相关的问题

永远不要PHPSESSID在cookie之外暴露用户(会话ID),如果有人知道其他人的会话ID,他们可以简单地使用它来登录他们的帐户

Remember me功能要非常小心,可能会显示一点警告.

用户登录时刷新会话ID(或任何适当的)

超时非活动会话

永远不要相信cookie,它可以随时由脚本/用户进行更改,删除,修改和创建

防止与SQL相关的问题

始终使用预备陈述.准备好的语句会导致用户输入单独传递并阻止SQL注入

使代码失败时抛出异常.有时您的SQL服务器可能由于某种原因而关闭,库PDO默认情况下会忽略该错误,并在日志中记录警告.这会导致从数据库获取的变量为空,具体取决于您的代码,这可能会导致安全问题.

有些库就像PDO 模拟预处理语句一样.把它关掉.

UTF-8在数据库中使用编码,它允许您存储几乎任何字符并避免与编码相关的攻击

永远不要将任何内容连接到您的查询.类似的$myquery = "INSERT INTO mydb.mytable (title) VALUES(" . $user_input . ")"事情意味着你有一个SQL注入的巨大安全风险.

将上传的文件存储在随机,无扩展名的文件名中.如果用户上传带有.php文件扩展名的文件,那么只要您的代码加载该文件,它就会执行它,并使用户能够执行一些后端代码

确保您不会受到CSRF攻击.

始终更新PHP副本以确保最新的安全修补程序和性能改进



3> Quentin..:

只对数据进入需要编码的系统进行编码 - 否则您将遇到想要操纵实际数据的情况.

对于SQL注入 - 使用如何在PHP中阻止SQL注入中描述的绑定变量?(它谈论准备好的陈述,但它是给你保护的绑定,而不是准备).

对于XSS - 如果您在指定HTML或文本的位置写入HTML.在生成文档的位置使用htmlentities.我会避免以这种形式将数据存储在数据库中(除了可能在写入稀疏读取的系统中,CPU性能/磁盘访问时间正在变成并发出 - 然后我会有一个raw_和html_版本的列...或者只使用memcached或类似的东西).

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

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有