【问题标题】:SQL injection id name contains '&'SQL 注入 id 名称包含 '&'
【发布时间】:2017-10-18 10:27:22
【问题描述】:

在我的 php 代码中,我为 php 传递了一个 id,以从 sql server 获取信息。 它似乎工作正常,但每当我的名称中有一个“&”时,它就不再工作了

$doc_info = array();
$id = "ID not set";
if(isset($_GET['document_id'])) {
    $id = $_GET['document_id'];
    $id = str_replace('___', '&', $id);
    $doc_info = get_document_info($id);
    $doc_info['dummy'] = " ";
}

适用于“2017_test id”的 id 示例

http://localhost/php/single-entry.php?document_id=2017_test%20id

在这里我得到了正确的信息。

“2017_e&i EDV”无效的 id 示例

http://localhost/php/single-entry.php?document_id=2017_e&i%20EDV

这里我得到 PHP 警告:未定义索引。虽然数据在数据库中。

我将 id 传递给另一个函数,该函数使用此 ID 获取存储在 DB 中的信息数组。 在第一个示例中,我获取了数据,但如果名称有 '&' 我得到 Undefined index

【问题讨论】:

  • “不起作用”到底是什么意思?
  • 了解 url 编码,因为 ?=& 等某些字符在 URL 中作为 GET 参数分隔符具有特殊含义
  • $_GET 中的 & 是一个特殊字符。从 G_GET 转换为 $_POST 看看是否有帮助

标签: php html sql-server


【解决方案1】:

您可以使用以下内容:

urlencode($document_id) - 在将请求发送到您的 php 脚本时
正如评论部分所指出的, $_GET["document_id"] 会给 你已经解码了值

并在您的 PHP 脚本中使用解码后的值。

【讨论】:

  • 你不需要urldecode,它是自动完成的。
  • 不,urldecode($_GET["document_id"]) 完全是多余的(并且可能有害)。
  • @zerkms 为什么有害,请解释一下。
  • 好吧,即使它是多余的,但它无论如何也没有用。
  • @Tarun 因为它改变了用户的原始数据
猜你喜欢
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多