【问题标题】:sql injection / Browser-Hijacker prevention phpsql注入/浏览器劫持预防php
【发布时间】:2011-03-15 06:37:27
【问题描述】:

我有一个网站,无法使用 html_entities() 或 html_specialchars() 来处理用户输入数据。相反,我添加了一个自定义函数,它最终是一个函数,它使用数组 $forbidden 来清除输入字符串中所有不需要的字符。目前,由于 sql 注入/浏览器劫持,我将 ''、"'" 作为不需要的字符。我的网站以 utf-8 编码 - 我是否必须向该数组添加更多字符,即字符“

感谢您的帮助,

梅尼

【问题讨论】:

  • 为什么不能使用 htmlentities()?
  • 因为它使用 kyrillic 字符会做一些奇怪的事情,我希望启用这些字符以供用户输入。
  • 您是否尝试过使用带有可选字符集参数的 htmlentities()?
  • 你不能使用带有utf8编码的htmlspecialchars?有关编码类型,请参阅文档:php.net/manual/en/function.htmlspecialchars.php
  • 嗯,是的,我可以将 utf-8 与 htmlentities 一起使用,但是当我这样做时,在我的数据库中,像Начало 这样的词将显示为 Явл& #1077;ние абсолютного зла,这有点难以阅读......所以我需要的是一种可能性,以原样保存Начало,同时,没有安全性问题...

标签: php security sql-injection


【解决方案1】:

你也应该逃避"。它比' 危害更大,因为您经常将HTML 属性包含在" 中。但是,你为什么不简单地使用htmlspecialchars 来完成这项工作呢?

此外:对 SQL 和 HTML 都使用一个转义函数是不好的。 HTML 需要转义标签,而 SQL 不需要。因此,最好将htmlspecialchars 用于HTML 输出,将PDO::quote(或mysql_real_escape_string 或您正在使用的任何东西)用于SQL 查询。

但我知道(根据我自己的经验)在 SQL 查询中转义所有用户输入可能真的很烦人,有时我根本不转义部分,因为我认为它们是“安全的”。但我确信我并不总是正确的,关于假设。所以,最后我想确保我真的逃避 SQL 查询中使用的 所有 变量,因此编写了一个小类来轻松地做到这一点:http://github.com/nikic/DB 也许你想使用类似的东西,也是。

【讨论】:

    【解决方案2】:
    1. htmlentities 和 htmlspecialchars 函数与 sql 注入无关
    2. 为了防止注入,你必须遵守一些规则,我已经描述了它们here
    3. 过滤 HTML 你可以使用 htmlspecialchars() 函数,它不会损害你的西里尔字符

    【讨论】:

    • 确实 htmlentities 或 htmlspecialchars 与 sql 注入无关,这将用于浏览器劫持。尽管如此,似乎我遇到的问题确实是编码问题,因为所有西里尔字符都是通过 POST 发送的,因此被转换为 & 符号。我还没有找到将 & 符号转换为 utf-8 字符的方法,有人知道吗?梅尼
    【解决方案3】:

    将此代码放入您的标题页。可以防止PHP中的SQL注入攻击。

    函数 clean_header($string) { $string = 修剪($string);

    // 来自 RFC 822:“字段主体可以由任何 ASCII 组成 // 字符,CR 或 LF 除外。” if (strpos($string, "\n") !== false) { $string = substr($string, 0, strpos($string, “\n”)); } if (strpos($string, "\r") !== false) { $string = substr($string, 0, strpos($string, “\r”)); }

    返回$字符串; }

    【讨论】:

    • 应该以某种方式阻止灾难
    猜你喜欢
    • 2012-01-15
    • 2016-12-11
    • 1970-01-01
    • 2012-05-22
    • 2016-11-08
    • 1970-01-01
    • 2012-02-20
    • 2017-12-17
    • 2012-12-21
    相关资源
    最近更新 更多