我打算将它用于将由我的用户输入的文本块。当然,我想避免恶意滥用该网站。
从我读过的关于MYSQL 注入和XSS的内容来看,我只允许简单的文本,没有 HTML 标记,没有链接,没有什么特别的,只有纯文本和一些文字链接。
这样就够了吗?
mysql_real_escape_string(strip_tags($_POST['datablock']));
绑定 SQL 参数而不是手动构建 SQL 字符串也是一种很好的做法(请参阅Little Bobby Tables 上的 xkcd)。
简短的回答:不。
长答案更复杂。
您必须确保保护您的 SQL 查询免受注入错误的影响。最好的方法是永远不要将用户数据直接注入到您的查询中,而是使用数据库驱动程序的 SQL 占位符为您执行插入操作。这是迄今为止最安全的方法。您的查询最终将如下所示:
INSERT INTO table_name (user_id, comment) VALUES (:user_id, :comment)
然后以驱动程序可以正确编码的方式将数据绑定到各种占位符。对此进行自律可以避免几乎所有的 SQL 注入问题。
您还必须通过不允许用户在您的页面中插入带有脚本的任意 HTML 来保护您的 HTML 免受XSS 攻击。您应该始终将用户输入呈现为 HTML 实体化等效项,除非您绝对确定此用户内容没有<script>
类型标签或 JavaScript 潜入各种元素。请注意,这很难正确执行,因为 JavaScript 根本不限于脚本标签。它可以作为属性出现在 HTML 元素甚至 CSS 样式定义中。
此外,您永远mysql_query
不应在新应用程序中使用或任何相关功能。这些方法在默认情况下是危险的,如果您错过一个变量,就会对您造成严重伤害。自动化 SQL 注入工具具有一系列可怕的功能,而这些工具所需要的只是一个未转义的变量。
值得庆幸mysql_query
的是,它已被弃用,它在 PHP 5.5.0 中产生警告,并将在 PHP 的未来版本中完全删除。
至少您应该使用PDO进行数据库访问。它支持命名占位符,并且可以很容易地审核您的数据库接口代码以确保其安全。错误会突出。作为一项安全措施,最好用单引号定义查询字符串,'INSERT INTO ...'
这样如果您错误地放入变量,它不会被意外插值,但最终会产生无害的 SQL 错误。
理想情况下,您应该使用PHP 框架来构建您的应用程序。其中大多数都有用于安全数据库访问、HTML 转义和 XSS 保护的标准化方法。除非您想花一年时间编写自己的框架,否则这不是您可以自己完成的事情。