Php mysql\u real\u escape\u字符串和html\u特殊\u字符足够了吗?

Php mysql\u real\u escape\u字符串和html\u特殊\u字符足够了吗?,php,security,sql-injection,code-injection,Php,Security,Sql Injection,Code Injection,这个问题被问了很多,但我仍然没有找到关于stackoverflow的直接答案。这两项功能是否足够?互联网上有很多自相矛盾的评论,“是的,很好”,“不,永远不要使用它”。其他人说,使用PDO,我不理解。我只是一个PHP初学者,所以我不完全理解所有的安全细节。 我试着阅读和理解下面的内容,但很多对我来说没有多大意义 如果我使用preg_replace删除不需要的字符会怎么样 我非常困惑,不知道从哪里开始 编辑:是否有人可以建议我如何理解准备好的语句(假设这是最好的选择)。取决于您使用输入的目的和

这个问题被问了很多,但我仍然没有找到关于stackoverflow的直接答案。这两项功能是否足够?互联网上有很多自相矛盾的评论,“是的,很好”,“不,永远不要使用它”。其他人说,使用PDO,我不理解。我只是一个PHP初学者,所以我不完全理解所有的安全细节。 我试着阅读和理解下面的内容,但很多对我来说没有多大意义


如果我使用preg_replace删除不需要的字符会怎么样

我非常困惑,不知道从哪里开始


编辑:是否有人可以建议我如何理解准备好的语句(假设这是最好的选择)。

取决于您使用输入的目的和目的

当清理php应用程序的输入时,唯一需要假设的是,有很多聪明人在那里,如果他们真的想破坏你的应用程序,他们会找到一种方法

遵循您列出的指南和其他指南是一个很好的开始。但是,您所做的每一点消毒都会花费大量的时间和内存来执行

因此,这一切都取决于您使用输入的目的和目的

mysql\u real\u escape\u string和html\u special\u字符是很好的实用程序,但您不应该完全依赖它们,它们也不总是需要的

不要气馁,因为即使是成熟且编程良好的网站也必须跟上最新的xss和其他攻击。有趣的猫捉老鼠游戏

你可以从一个框架开始,我喜欢codeignitor。浏览他们的安全类,看看他们是如何处理的


或者更好的方法是,编写一个简单的表单处理器,并尝试自己想出运行任意代码的方法。你会惊讶于你能想出多少方法。

Sam,如果你将输入存储在数据库中,为了避免SQL注入和XSS,那么这两个函数就足够了。如果你存储密码,你必须加密密码ORD采用单向加密(即无法解密)

让我扩大我的答案: 首先,SQL注入是一种方法,恶意用户会试图修改您的SQL语句,使其符合他们的意愿。例如,假设您有一个登录表单。通过将以下值之一插入未受保护的表单,我将能够在不知道用户名或密码的情况下登录到第一个帐户:

' or 1=1 -- 
上面的注入有很多版本。让我们看看它对数据库上执行的SQL有什么影响:

SELECT * FROM users WHERE username='' or 1=1-- ' AND password='' or 1=1--';
SELECT * FROM users WHERE username='\' or 1=1-- ' AND password='\' or 1=1--';
PHP: mysql_查询(“从username='“$username.”和password='“$password.”的用户中选择*”

执行上述操作时,将向数据库发送以下SQL:

SELECT * FROM users WHERE username='' or 1=1-- ' AND password='' or 1=1--';
SELECT * FROM users WHERE username='\' or 1=1-- ' AND password='\' or 1=1--';
此SQL的有效部分如下所示: 从用户名为“”或1=1的用户中选择*

由于双破折号(后面有空格)是注释,因此删除了语句的其余部分

现在,这为恶意用户提供了访问权限。通过使用诸如mysql\u real\u escape\u string之类的转义函数,您可以转义内容,从而将以下内容发送到数据库:

SELECT * FROM users WHERE username='' or 1=1-- ' AND password='' or 1=1--';
SELECT * FROM users WHERE username='\' or 1=1-- ' AND password='\' or 1=1--';
现在,它将转义引号,生成预期的字符串,即-string

现在让我们来看一些XS。 另一个恶意用户希望更改页面布局。2005年Facebook上的Facespace攻击是一个众所周知的XSS攻击。这涉及将原始HTML插入表单。数据库将保存原始HTML,然后将其显示给用户。恶意用户可以使用脚本标记插入一些javascript,这可能会导致o javascript可以做的任何事情

通过将<和>分别转换为<l;和>,可以对此进行转义

这应该足以保护网站上的正常内容。但是密码是另一回事

对于密码,您还必须加密密码。建议使用PHP的crypt函数进行加密

但是,一旦密码被加密并作为加密密码保存在数据库中,您如何解密它以检查它是否正确?答案很简单-您不需要解密。提示:密码总是加密到相同的值


您是否认为“我们可以在用户登录时加密密码并对照数据库中的密码进行检查”,您是正确的…

假设您询问的是安全问题,mysql\u real\u escape\u字符串存在一个问题

此功能与安全性完全无关。

无论何时需要转义,都需要转义,尽管存在“安全性”,但仅仅因为SQL语法需要转义。而在不需要转义的地方,转义对您毫无帮助

此函数的用法很简单:当您必须在查询中使用带引号的字符串时,您必须转义它的内容。这不是因为一些虚构的“恶意用户”,而是为了转义这些用于分隔字符串的引号。这是一条极其简单的规则,但PHP人员却大错特错

这只是与语法相关的函数,与安全性无关

根据安全事项中的此功能,相信它将“保护您的数据库免受恶意用户的攻击”将导致您进行注入

你可以自己得出的结论:
不,此功能不够


准备好的语句也不是万能的。它只覆盖了一半可能的情况。

你可能会发现这是对整个问题的一个很好的介绍:我真正觉得很有用的是:如果你描述一个ID或类似的东西,只需键入将输入变量转换为数字即可(例如,当删除条目时,您的url可能看起来像
delete.php?id=100
):
“从表中删除,其中id=“(int)$\u GET['id']