表单安全,php,mysql,utf8 [重复]

Posted

技术标签:

【中文标题】表单安全,php,mysql,utf8 [重复]【英文标题】:Form security, php, mysql, utf8 [duplicate] 【发布时间】:2016-04-06 08:36:46 【问题描述】:

我正在制作一个注册表单,其中一些输入进入数据库,而另一些则没有。我的页面使用 utf8。对于不进入数据库的数据,我使用这个函数(一种 htmlspecialchars):

$c = array("'", '"', "/", "<", ">", "$", "%");
$s = str_replace($c, "", $s);

对于数据库,我将使用 mysqli_real_escape_string。 从安全的角度来看2个问题,假设我想允许符号和unicode(utf8)。

1-对于不进入db的数据,上面的功能是否足够?

2- 对于数据库中的数据,是否足够 mysqli_real_escape_string 或者我也应该使用上面的函数?还是别的什么?

谢谢。

Update1在回答后更新。

$c = array("'", '"', "/", "\\", "<", ">", "$", "%", "&");
$s = str_replace($c, "", $s);

更新2 因此,要插入数据库,我应该使用 realescapestring 或准备。然后在每个输出处转义,这取决于平台/语言。

2 注释:

这样一来,我必须多次逃脱,而不是一次,但也有一些好处......

php 对小黑客的攻击似乎相当强大,看起来它会自动转义一些字符......

【问题讨论】:

跳过这个并使用准备好的语句。 【参考方案1】:
$c = array("'", '"', "/", "<", ">", "$", "%");

这种字符串修饰既没有必要也不足以防止注入问题到 HTML(因为与号)或 MySQL 字符串文字(因为反斜杠)。

注入是一个输出转义问题,而不是输入过滤问题。通过尝试在输入阶段全局处理它们,您会使您的应用程序因各种有效输入而中断,而不能保证通过其他方式进入的任何数据的安全输出。

为了防止 SQL 注入,mysqli_real_escape_string 很好,此时您正在构建查询字符串。 (尽管参数化查询通常更容易可靠地正确。)

为了防止 HTML 注入,htmlspecialchars 很好,此时您正在将字符串写入 HTML 模板。 (尽管需要一种能够自动进行 HTML 转义的模板语言,因此您有时不要忘记这样做。)

其他类型的注入需要自己的特殊处理。例如,如果您要输出到 URL 查询组件,则需要 urlencode();如果您要向 javascript 代码输出值,则需要类似 json_encode() 的内容。同样,这发生在您为这些东西创建输出的时候;您无法在输入过滤阶段处理此问题,因为您不知道什么数据将在什么上下文中结束。

输入过滤是一个好主意,可以删除您知道永远不会想要的字符(例如控制字符),并在特定输入字段中强制执行业务规则(例如用户名中的有效字符)。但是输入过滤绝对不是担心注入问题的地方。

【讨论】:

你说得对,我也害怕在 php 中验证时的黑客攻击,在第一次 trim()... 是的,字符串可以在输出时由 javascript 处理。 .. 例如,密码字段,永远不会显示,它允许符号,我应该只做 realescapestring 吗?【参考方案2】:

对于不进入数据库的数据,我使用这个函数(一种 htmlspecialchars):

为了将输出转义到网页上,为什么不直接使用htmlspecialchars()?例如:

function noHTML(string $input): string

    return htmlspecialchars($input, ENT_QUOTES | ENT_HTML5, 'UTF-8');

祝你好运。

对于数据库,我将使用 mysqli_real_escape_string。

请不要。见this answer。



SQLi 和 XSS 的一分钟解决方案

SQL Injection:使用准备好的语句 (without emulation!),不要费心转义。 Cross-site scripting: 需要格式化输出(例如 HTML)? HTMLPurifier 或 Stauros 输出。 否则,像上面的noHTML() 这样的函数会产生奇迹。 不要试图对这两个问题都使用一种万能的解决方案。

没有别的了。这些都是已解决的问题。

【讨论】:

我想使用我的函数因为我也想阻止一些 php/js

以上是关于表单安全,php,mysql,utf8 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的密码加密[重复]

PHP / MySQL:如何使用WHILE循环插入数据库[重复]

PHP将语句插入XAMPP MySQL数据库不会导致表更新[重复]

PHP表单使用AJAX获取MySQL [重复]

在php中从mysql数据库中获取货币符号[重复]

我可以安全地使用带有 utf8 列的 utf8mb4 连接吗?