这个问题被问了很多,但我仍然没有找到stackoverflow的直接答案。这两个功能是否足够?互联网上有很多矛盾的评论“是的很好吗?”,不,永远不会使用它。“其他人说,使用PDO,我不明白。我只是PHP的初学者,所以我不喜欢完全理解安全的所有细节。 我试过阅读并理解以下内容,但很多对我来说没有多大意义。
http://ha.ckers.org/xss.html
Do htmlspecialchars and mysql_real_escape_string keep my PHP code safe from injection?
如果我使用preg_replace去除不需要的字符怎么办?
我非常困惑,不知道从哪里开始。
编辑:请有人也可以推荐我如何理解准备好的陈述(假设这是最好的选择)。
答案 0 :(得分:2)
Sam,如果要将输入存储在数据库中,为了避免SQL注入和XSS,那么这两个函数就足够了。如果要存储密码,则必须使用单向加密对密码进行加密(即无法对其进行解密)。
让我扩大答案: 首先,SQL注入是一种方法,恶意用户将尝试修改您的SQL语句以使其按照自己的意愿行事。例如,假设您有一个登录表单。通过将以下值之一插入未受保护的表单,我将能够在不知道用户名或密码的情况下登录第一个帐户:
' or 1=1 --
上述注射剂有很多版本。让我们来看看它对数据库上执行的SQL的作用:
PHP: mysql_query(“SELECT * FROM users WHERE username ='”。$ username。“'AND password ='”。$ password。“';”);
执行以上操作时,会将以下SQL发送到数据库:
SELECT * FROM users WHERE username='' or 1=1-- ' AND password='' or 1=1--';
这个SQL的有效部分是这样的: SELECT * FROM users WHERE username =''或1 = 1
因为双短划线(后面有空格)是注释,删除了其余的声明。
现在,它为恶意用户提供了访问权限。通过使用诸如mysql_real_escape_string之类的转义函数,您可以转义内容,以便将以下内容发送到数据库:
SELECT * FROM users WHERE username='\' or 1=1-- ' AND password='\' or 1=1--';
现在转义引号,制作预期的字符串,只是 - 字符串。
现在让我们来看看一些XSS。 另一个恶意用户想要更改页面的布局。一个众所周知的XSS攻击是2005年Facebook上的Facespace攻击。这涉及将原始HTML插入表单中。数据库将保存原始HTML,然后将显示给用户。恶意用户可以使用脚本标记插入一些javascript,这可以执行javascript所能做的任何事情!
通过转换<来转义和>到< l;和>分别。您可以使用html_special_chars函数。
这足以保证网站上的正常内容。但密码是另一回事。
对于密码,您还必须加密密码。建议使用PHP的crypt函数。
但是,一旦密码被加密并作为加密密码保存在数据库中,您如何解密它以检查它是否正确?简单的答案 - 你不解密它。提示:密码始终加密到相同的值。
您是否在考虑'我们可以在用户登录时对密码进行加密,并根据数据库中的密码进行检查',您是对的......
答案 1 :(得分:0)
取决于您使用输入的内容以及输入的位置。
在为PHP应用程序清理输入时唯一要假设的是,那里有很多聪明的人,如果他们真的想破坏你的应用程序,他们会找到一种方法来实现它。按照您列出的指南和其他指南是一个很好的开始。但是,你所做的每一次消毒工作都会产生非常重要的时间和记忆。
所以这一切都取决于你使用输入的内容以及输入的位置。
mysql_real_escape_string和html_special_chars是很好的实用工具,但你不应该完全依赖它们,也不一定需要它们。
不要气馁,因为即使是成熟且编程良好的网站也必须跟上最新的xss和其他攻击。有趣的猫捉老鼠游戏。
你可以开始的一个地方是框架,我喜欢codeignitor。通过他们的安全课程来了解他们如何处理它。
或者更好的是,编写一个简单的表单处理器并试着想出自己运行任意代码的方法。你会对你能想出多少方法感到惊讶。
答案 2 :(得分:0)
假设您询问安全性,mysql_real_escape_string存在一个问题。
此功能与安全性完全无关。
每当你需要转义时,你需要它尽管有“安全性”,但只是因为它是SQL语法所必需的。你不需要的地方,逃避甚至无法帮助你一点点。
此功能的使用很简单:当您必须在查询中使用带引号的字符串时,您必须转义它的内容。不是因为一些想象中的“恶意用户”,而只是为了逃避用于分隔字符串的这些引号。这是一个非常简单的规则,但却被PHP人员误解了。
这只是语法相关的功能,与安全无关。
根据安全事项中的此功能,相信它会“保护您的数据库免受恶意用户攻击”将引导您注射。
你可以自己做出的结论:
不,此功能不够。
准备好的声明也不是银弹。它仅覆盖了一半可能的情况。