【问题标题】:What's wrong with this line in PHP?PHP中的这一行有什么问题?
【发布时间】:2014-05-12 12:11:28
【问题描述】:

代码

$stid = oci_parse($conn, "SELECT c1 FROM t1 WHERE c2 = " . $_POST['username'] . " AND c3 = " . $_POST['password'] . "");

问题

我得到ORA-00904ORA-24374

ORA-00904:字符串:无效标识符
ORA-24374: 在获取或执行和获取之前定义未完成

将代码中的$_POST 替换为$_POST 返回的固定字符串可停止错误。它必须是 $_POST 或我在代码中包含它的方式。

例如,$_POST['username']Doe,使用 $_POST['username'] 不起作用,但使用 Doe 可以。

【问题讨论】:

  • 请勿使用此代码! SQL Injection 如果我将1; drop table t1; 放入密码字段,你认为会发生什么?
  • 我敢打赌Tom 知道所有 Oracle 数字错误代码,但凡人可能不知道。发布到论坛时请不要破坏错误代码。
  • @Uriel_SVK 正如我在下面对所谓的“答案”之一所说的那样,你假设太多了。
  • @user2656114 好吧,如果您使用参数化查询,那么引号不会有问题......

标签: php oracle oracle-call-interface


【解决方案1】:

尝试制作报价查询变量。看起来你正在将字符串传递给 db

$stid = oci_parse($conn, "SELECT c1 FROM t1 WHERE c2 = '" . $_POST['username'] . "' AND c3 = '" . $_POST['password'] . "'");

同时转义您的帖子数据以防止 sql 注入。

【讨论】:

  • 逃避是石器时代的机制。 OCI 扩展甚至不提供所需的功能。没有理由故意编写不安全的代码。
【解决方案2】:

您的代码行的主要问题是它为 SQL 注入打开了大门;一个电话让你的服务器被黑。在manual page for the oci_parse() function 中,您已经在使用您有一个关于如何将参数传递给查询的示例:

$stid = oci_parse($conn, 'begin myproc(:p1, :p2); end;');
oci_bind_by_name($stid, ':p1', $p1);
oci_bind_by_name($stid, ':p2', $p2, 40);

oci_execute($stid);

您的代码可能如下所示:

$stid = oci_parse($conn, "SELECT c1 FROM t1 WHERE c2 = :username AND c3 = :password");
oci_bind_by_name($stid, 'username', filter_input(INPUT_POST, 'username');
oci_bind_by_name($stid, 'password', filter_input(INPUT_POST, 'password');
oci_execute($stid);

...尽管对返回值进行错误检查仍然是个好主意。上面的所有三个函数都会在出错时返回 FALSE,而您可以通过 oci_error() 获取包含最后一条错误消息的数组。

【讨论】:

    猜你喜欢
    • 2011-10-19
    • 1970-01-01
    • 2010-11-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多