0

我在 php 和 mysql 中有一个脚本,我想保护它的输入免受 sql 注入。
我知道一些功能,但真的不知道应该在哪里以及如何使用它们。
功能是:

nl2br()
preg_replace()
htmlspecialchars()
mysql_real_escape_string()
htmlentities()

我的输入是:

username
password
mobile
email
url
description (text area)

任何人都可以为我解释我该怎么办?

谢谢

4

6 回答 6

2

您必须使用名为mysqli的更新版本的 mysql 驱动程序,或者您可以使用诸如PDO之类的替代方案

您可以将数据库与准备好的语句结合使用。这是防御sql注入的唯一方法。因此,花点时间选择其中一门课程并学习如何使用它们。

ps,

仍然 sql 注入不是您唯一需要担心的事情。有人可以在公共表单中添加一些 JavaScript 来隐藏页面或类似的东西。您可以使用它来过滤掉它们,preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $var);但这只是一个示例,还有更多要学习的内容,只需查看 PDO 或 mysqli 并开始构建。

于 2013-08-16T08:01:12.983 回答
1

nl2br()— 在字符串中的所有换行符之前插入 HTML 换行符。

 echo nl2br("foo isn't\n bar"); // Outputs: foo isn't<br />bar

preg_replace()- 使用正则表达式替换匹配的字符串。

preg_replace("/[^0-9]+/","",$string); //输出:仅返回任何字符串中的数字。

htmlspecialchars()- 将特殊字符转换为 HTML 实体。

echo htmlspecialchars("<a href='test'>Test</a>");// <a href='test'>测试</a>

mysql_real_escape_string()- 转义字符串中的特殊字符以在 SQL 语句中使用。

htmlentities()- 将所有适用的字符转换为 HTML 实体。

 echo htmlentities($str);

$str = "A 'quote' is <b>bold</b>";// 输出:“引号”是<b>粗体</b>

于 2013-08-16T08:03:34.933 回答
1

在 sql-injections 上下文中您需要的唯一功能是 mysql_real_escape_string()

但请记住,您应该使用 mysqli_* 或 PDO 而不是 mysql_*

于 2013-08-16T07:48:58.420 回答
1

利用

htmlspecialchars()

在向用户显示数据之前。它将转义 html 符号。此功能将防止 XSS 攻击。

利用

mysqli_real_escape_string()

在将数据放入数据库之前。这将转义 sql 符号。这将防止 SQL 注入。

mysql 已弃用;改用 mysqli 扩展(mysqli_real_escape_string() 或 mysqli::real_escape_string() 以 OOP 风格)。

于 2013-08-16T07:49:12.530 回答
0

你的问题很好,应该让更多人问。

您应该应用的原则在计算机世界中被助记符 FIEO所熟知。

过滤输入转义输出。

在 Internet 上搜索“PHP FIEO”将帮助您整理思路,然后将所有这些安全类型的功能放在 FI 或 EO 的一侧或另一侧。

当您阅读它时,对这个问题的答复应该更有意义,并有助于确定您需要哪些安全功能,哪些只是为了使文本处理更简单一些(即nl2br()等)

最初将花费几个小时,并帮助您晚上入睡,无论如何,它确实对我有用。祝你好运!

于 2013-08-16T08:16:45.657 回答
0

反对 SQL 注入的第一条规则:使用准备好的语句或参数化查询。不要将未经检查的用户输入传递给任何 SQL 命令。您可以通过使用 mysqli 或 PDO 来实现这一点,但不要使用已弃用的 mysql 库,您应该不惜一切代价避免使用它。

于 2013-08-16T07:50:06.580 回答