我有点困惑,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
插入数据库时使用
htmlentities()
在将数据输出到网页时使用
htmlspecialchars()
用的时候?
strip_tags()
用的时候?
addslashes()
用的时候?
htmlspecialchars
大致相同htmlentities
.区别:字符编码.
像两个编码控制字符<
,>
,&
等等用于打开标签等htmlentities
也编码从像元音变音,欧元符号和的其他文字字符.如果您的网站是UTF,请使用htmlspecialchars()
,否则请使用htmlentities()
.
htmlspecialchars
/ entities
编码特殊字符,因此它们被显示但不被解释.strip_tags
删除它们.
在实践中,这取决于您需要做什么.
例如:您编写了一个论坛,并为用户提供了一个文本字段,以便他们发布内容.恶意的只是尝试:
pictures of kittens here
如果您不执行任何操作,将显示该链接,并且点击该链接的受害者会获得大量弹出窗口.
如果您输出htmlentity/htmlspecialchar,则文本将按原样存在.如果你strip_tag它,它只是删除标签并显示它:
pictures of kittens here
有时你可能想要混合物,在那里留下一些标签,比如(
strip_tags
可以在那里留下某些标签).这也是不安全的,所以最好使用一些完整的库来对抗XSS.
引用旧版本的PHP手册:
在需要在数据库查询等中引用的字符之前返回带有反斜杠的字符串.这些字符是单引号('),双引号("),反斜杠()和NUL(NULL字节).
使用addslashes()的一个示例是在将数据输入数据库时.例如,要将名称O'reilly插入数据库,您需要将其转义.强烈建议使用DBMS特定的转义函数(例如MySQL的mysqli_real_escape_string()或PostgreSQL的pg_escape_string()),但如果您使用的DBMS没有转义函数且DBMS使用\来转义特殊字符,那么可以使用这个功能.
在目前的版本是不同的措词.
我想到了这个快速清单:
始终使用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副本以确保最新的安全修补程序和性能改进
只对数据进入需要编码的系统进行编码 - 否则您将遇到想要操纵实际数据的情况.
对于SQL注入 - 使用如何在PHP中阻止SQL注入中描述的绑定变量?(它谈论准备好的陈述,但它是给你保护的绑定,而不是准备).
对于XSS - 如果您在指定HTML或文本的位置写入HTML.在生成文档的位置使用htmlentities.我会避免以这种形式将数据存储在数据库中(除了可能在写入稀疏读取的系统中,CPU性能/磁盘访问时间正在变成并发出 - 然后我会有一个raw_和html_版本的列...或者只使用memcached或类似的东西).
如果您要让用户输入URL,那么您需要更加小心,因为javascript:do_evil()
它将执行有效的URI(例如,作为点击链接的href或(在某些浏览器中)刚刚加载的图像的src).