PHP:这对恶意输入安全吗?

PHP:这对恶意输入安全吗?,php,html,mysql,forms,security,Php,Html,Mysql,Forms,Security,我打算将其用于将由我的用户输入的文本块。当然,我希望避免恶意滥用网站 从我所读到的和,我只允许简单的文本,没有HTML标记,没有链接,没有什么特别的只是纯文本和一些文字链接 这够了吗 mysql_real_escape_string(strip_tags($_POST['datablock'])); 绑定SQL参数而不是手动构建SQL字符串也是一种很好的做法(请参阅)。简短回答:否 长答案更为复杂 您必须确保保护SQL查询免受攻击。最好的方法是不要直接将用户数据注入到查询中,而是使用数据库驱动

我打算将其用于将由我的用户输入的文本块。当然,我希望避免恶意滥用网站

从我所读到的和,我只允许简单的文本,没有HTML标记,没有链接,没有什么特别的只是纯文本和一些文字链接

这够了吗

mysql_real_escape_string(strip_tags($_POST['datablock']));

绑定SQL参数而不是手动构建SQL字符串也是一种很好的做法(请参阅)。

简短回答:

长答案更为复杂

您必须确保保护SQL查询免受攻击。最好的方法是不要直接将用户数据注入到查询中,而是使用数据库驱动程序的SQL占位符为您进行插入。这是迄今为止最安全的方法。您的查询结果如下所示:

INSERT INTO table_name (user_id, comment) VALUES (:user_id, :comment)
然后将数据绑定到各种占位符,以便驱动程序能够正确地对其进行编码。严格遵守这一点可以避免几乎所有的SQL注入问题

您还必须通过不允许用户在页面中插入带有脚本的任意HTML来保护HTML免受攻击。您应该始终将用户输入呈现为HTML实体化等价物,除非您完全确定此用户内容没有类型标记或JavaScript偷偷进入各种元素。请注意,这很难正确执行,因为JavaScript根本不局限于脚本标记。它可以作为属性显示在HTML元素上,甚至在CSS样式定义中

此外,您应该永远不要在新应用程序中使用
mysql\u query
或任何相关函数。默认情况下,这些方法是危险的,如果您遗漏了一个变量,就会对您造成严重伤害。有一个可怕的特性列表,这些工具所需要的只是一个未经扫描的变量

谢天谢地,
mysql\u query
已被弃用,它在PHP5.5.0中产生警告,并将在未来的PHP版本中完全删除

至少您应该使用它来访问数据库。它支持命名占位符,并使审核数据库接口代码以确保其安全非常容易。错误会很明显。作为一种安全措施,最好使用单引号定义查询字符串,如
'INSERT INTO…'
,这样,如果您错误地输入了变量,它就不会被意外插入,但最终会产生无害的SQL错误


理想情况下,您应该使用a来构建应用程序。其中大多数都有用于安全数据库访问、HTML转义和XSS保护的标准化方法。除非你想花一年时间写一个自己的框架,否则这不是你能自己做的事情。

这对我来说绝对安全。您正在使用适当的php函数来防止sql注入,并且正在从输入中剥离所有html标记。从那里剩下的就是文字。我唯一能建议的另一件事是通过htmlentities()运行它,以防止人们添加HTML寓言字符。这要看情况而定。对你来说安全吗?有许多非常复杂的XSS攻击,
strip_tags()
对它们没有帮助。类似地,
mysql\u real\u escape\u string()
也不会阻止SQL注入方法。如果你写的是一个没有真实的个人身份数据和最小的XSS风险敞口的菜谱网站,这可能是可以的。如果您正在传输/显示财务信息,则可能不是。在输入卫生方面,你的兔子洞到底有多深实际上取决于你的用例。为了让迈克明白关于XSS的观点,请检查以下链接:好吧,我必须说我的立场完全面对未知。因此,我非常感谢这里的所有评论和意见。我想问一下@MikeBrant,在没有任何可能的标签来启动Javascript的情况下,如何实现XSS?还有其他方法吗?@Ted查看上面由ficuscr提供的链接。这是一些很好的例子。总而言之,
strip\u tags()
无法处理许多字符编码向量。为什么
mysql\u query
在默认情况下是“危险的”?
mysql\u query
进行零转义,并且不支持占位符。因此,需要使用字符串插值来构造查询。如果您的应用程序中甚至有一个未转移值的实例,它可能会被完全打开。这是一个不可接受的风险水平。如果您使用SQL占位符并完全避免字符串插值,那么默认情况下您是安全的,并且必须避免造成SQL注入错误。