【问题标题】:API doesn't allow textAPI 不允许文本
【发布时间】:2019-06-12 20:06:01
【问题描述】:

我刚刚为我正在处理的 CAD/MDT 创建了一个简单的 API,当我执行 /citations/userid/1 时,我已经设法让它显示正确的信息。然后,这将显示 SQL 数据库中的所有正确值,但是,如果我执行 /citations/issued_by/kevingorman1000,它只会抛出一个错误。我无法判断错误是什么,因为我正在使用 Slim php,并且似乎无法显示错误。

任何想法为什么它不起作用?我在下面添加了我的代码..

$app->get('/citation/issuedby/{issued_by}', function(Request $request, Response $response){

$issued_by = $request->getAttribute('issued_by');

$sql = "SELECT * FROM ncic_citations WHERE issuedby = $issuedby";
try{

    // Get DB Object
    $db = new db();
    // Call Connection to DB
    $db = $db->connect();

    $stmt = $db->query($sql);

    $issby = $stmt->fetchAll(PDO::FETCH_OBJ);
    $db = null;

    echo json_encode($issby);

} catch(PDOExecption $e) {
    echo '{"error"} : {"text": '.$e->getMessage().'}';
}});

任何想法为什么会这样?它只允许通过号码获取还是我还需要做其他事情?第一次使用这个,对 PHP 也有点陌生。

感谢您的帮助。

【问题讨论】:

  • 谢谢你的警告 Dharman,老实说,这没有什么重要的,所以如果它被闯入了,那么什么都没有关系。我会在未来弄清楚如何正确地做到这一点,但从我在网上发现的只是做一些研究的结果来看,这就是人们所说的方式。它不会有任何个人/私人信息。角色扮演社区的所有组成部分。
  • 我的评论是您问题的答案。这不是您将来可能会考虑的小建议,而是您的代码中的一个严重问题。

标签: php rest slim-3


【解决方案1】:

您的问题称为 SQL 注入。您可以使用准备好的语句来解决它。永远不要像其他人建议的那样,用引号或其他任何东西来转义值。

$sql = "SELECT * FROM ncic_citations WHERE issuedby = ? ";
$stmt = $db->prepare($sql);
$stmt->execute([$issuedby]);
$issby = $stmt->fetchAll(PDO::FETCH_OBJ);

关于PDO 的好教程和我推荐的准备好的语句:https://phpdelusions.net/pdo

【讨论】:

  • 好的,正如大家所说,我会考虑做准备好的陈述。你认为这些信息足够可靠吗? w3schools.com/php/php_mysql_prepared_statements.asp我知道你在上面发帖,但我只是喜欢寻找大量的例子,所以我大致知道我要做什么
  • @KevinGorman 查看更新的答案,我添加了一个指向 PHP 上值得信赖的资源的链接。不要相信 w3schools 和 PHP,即使这篇文章是正确的或有用的,这个网站仍然充满了糟糕的代码。
  • 好的,谢谢。我appricate的信息和帮助。我去看看能不能那样做
【解决方案2】:

这是因为 SQL 错误(字符串周围缺少引号)。

您尝试发送查询

$sql = "SELECT * FROM ncic_citations WHERE issuedby = kevingorman1000";

正确的查询必须是

$sql = "SELECT * FROM ncic_citations WHERE issuedby = 'kevingorman1000'";

【讨论】:

  • 哦,好吧,我现在觉得自己很愚蠢……那行得通。谢谢。
  • 甚至没有提到 SQL 注入?来吧。这是一个危险的代码,一旦遇到' 字符就会中断。
  • @ceejayoz:问题出在错误查询中,您在我的查询中看到 SQL 注入,嗯?你可能很高兴给予-1,享受(不要为了声誉而这样做)。
  • @panther 虽然您的答案不存在 SQL 注入,但您暗示只需加上引号即可。否决票是因为提供的答案不足。
  • @Chris No. 这不是本网站的运作方式。这不是任何事情的运作方式。这个答案提供了一个解决方案,但是一个错误的。 OP 是否想要正确地做到这一点取决于他们,但 SO 社区不能提供写得不好的答案,而不会被否决。问题显然是询问将数据传递给 SQL 并将数据作为查询的静态部分的问题,这不是正确的解决方案。
猜你喜欢
  • 1970-01-01
  • 2014-06-18
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
相关资源
最近更新 更多