【问题标题】:php prepared statement inserting with trim or date() etc. php strict standards errorphp 准备好的语句插入 trim 或 date() 等 php 严格标准错误
【发布时间】:2016-01-06 00:34:25
【问题描述】:

希望是一个非常简单的问题,但我一直无法找到答案。我正在学习使用准备好的语句而不是 mysqli_escape。我有代码:

$stmt = $dbc->prepare("SELECT something FROM the_table WHERE email=? ");
$stmt->bind_param("s", strtolower(trim($_REQUEST['email'])));

我收到错误消息“PHP Strict Standards: Only variables should be pass by reference in”。

我认为您不应该在绑定参数行中使用 strtolower / trim 等是否正确?这很重要吗?首先有一个单独的是否不太安全:

   $email = strtolower(trim($_REQUEST['email'])));

我有点想我应该尝试将 $_POST、$_REQUEST 位实际保留在 bind_param 行中。

我在另一个页面中也遇到了同样的问题:

$stmt->bind_param("s", date("Y-m-d") );

最后单独,直接使用插入$_SESSION 变量是否安全?这些本来是以前设置的,但是它们可以被黑客入侵吗?如果我之前设置了$_SESSION['admin']="off",然后稍后在admin=? 的查询中使用它,其中bind_param("s", $_SESSION['admin']); 安全吗?

非常感谢。

【问题讨论】:

    标签: php session prepared-statement mysql-real-escape-string


    【解决方案1】:

    当您执行trim($x) 之类的操作时,输出的不是变量,而是对值的引用。 bind_param 方法期望获得一个变量以使其工作。因此,这意味着您需要将其传递给该函数之前进行格式化和其他调用。所以是的,你的想法是正确的。

    例如,这是正确的做法:

    $date = date('Y-m-d');
    $stmt->bind_param("s", $date);
    

    我建议您阅读参考资料以更好地理解:http://php.net/manual/en/language.references.php

    【讨论】:

    • 谢谢。这是否也意味着您不能只输入一些特定的文本,例如bind_param("s", 'sometext'); 没有先将其作为变量?
    • 是的。请记住,您在此处绑定了一个参数。如果你有一个字符串文字,那可以是你实际查询的一部分,因为没有任何准备。
    • $stmt = $dbc->prepare("UPDATE something SET this='that' WHERE email=? "); $stmt->bind_param("s", $email); 这样合适吗?可以在其中包含“那个”吗?
    • 是的,没关系。准备好的语句的最大原因是为了防止用户输入的 SQL 注入。像这样的固定字符串不能被恶意用户更改,因为它是硬编码的。至于“正确”,这取决于情况。如果这是你想要配置的东西,你应该把它变成一个变量并像其他任何东西一样绑定参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    相关资源
    最近更新 更多