【问题标题】:wrong url extraction错误的url提取
【发布时间】:2011-12-19 23:13:00
【问题描述】:

我正在通过文本区域从我的网站上的用户那里获得输入。输入可能包含 TAG。
我想从输入中提取 url。

$res = get_magic_quotes_gpc() ? stripslashes($data) : $data;
$res = mysql_real_escape_string($res); // php 4.3 and higher                
preg_match('#href\s*?=\s*?[\'"]?([^\'"]*)[\'"]?#i', $res, $captures);                
$href = $captures[1];

示例

如果输入是这个?

$data = 'any string <a href="http://www.example.com">Any Anchor</a>';

提取出来的输出变成

"\"http://www.example.com""

我检查了每一行之后的输出,2个双引号在

之后
mysql_real_escape_string($res);

【问题讨论】:

  • 那么不要打电话给mysql_real_escape_string...?
  • 我之前告诉过你一些问题,不要一遍又一遍地复制$res = mysql_real_escape_string($res); // php 4.3 and higher,因为你不需要它。而且很可能您也不需要$res = get_magic_quotes_gpc() ? stripslashes($data) : $data;,因为现在已禁用魔术引号。
  • 而不是繁琐的魔术引号检查,一次使用来自php.net/manual/en/security.magicquotes.disabling.php的示例函数之一解决该问题

标签: php regex extract


【解决方案1】:

mysql_real_escape_string 应该只在并且总是在将用户值传递到 MySQL 查询时使用。不要将它用于其他任何事情,为正确的任务使用正确的转义函数。

在这里,我认为您根本不需要使用转义函数。您的正则表达式看起来不错,如果您删除转义函数,我相信它会起作用。

另外,如果可以避免,请不要使用get_magic_quotes_gpc。我可以解释原因,但我认为自 PHP5.0 以来它已被弃用的事实已经足够证明。如果您的主机不允许您禁用它,我会考虑切换到更精明的主机。

【讨论】:

  • 我需要 mysql_real_escape_string 函数,因为我正在将数据发送到数据库并同时使用 ajax 进行屏幕显示
  • 将其放入查询时将其转义,而不是之前,而不是之后。
【解决方案2】:

您为什么不尝试使用 XPath 处理输入以查找 a 元素,然后提取 href 属性值。我做了类似的事情,并使用 XPath 来处理输入,这很奏效。如果您想稍后考虑其他标签,则无需编写非常复杂的正则表达式。

希望这会有所帮助。

【讨论】:

  • 我强烈建议不要这样做,因为它要求您的 HTML 是有效的 XML(或 XHTML)。我知道有些框架会这样做,也许这是一个品味问题,但我相信你会因为没有实际利益而受到沉重的惩罚。如果您不能从本质上保证您的 HTML 是有效的 XHTML,请不要这样做,否则......去吧?
  • 点了...没有考虑到这一点。在黑名单方法中,所有用户输入无论如何都被认为是恶意的,因此假设输入将是有效的 XML 有点愚蠢。
  • 好吧,如果用户输入在前面的验证步骤中不是有效的 XHTML,那么您可以拒绝用户输入,如果您的 WYSIWYG 保证也能生成有效的 XHTML,这很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 2011-10-13
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多