Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在将用户输入插入数据库之前,除了准备好的语句之外,还有什么其他内容吗?_Php_Mysql_Sql - Fatal编程技术网

Php 在将用户输入插入数据库之前,除了准备好的语句之外,还有什么其他内容吗?

Php 在将用户输入插入数据库之前,除了准备好的语句之外,还有什么其他内容吗?,php,mysql,sql,Php,Mysql,Sql,根据我目前的理解,将用户输入插入数据库的风险是sql注入,由准备好的语句处理,根据我所阅读的内容,在使用htmlspecialchars()等函数将数据保存到数据库之前,不应更改数据从页面上的数据库回显用户输入时,应始终使用此选项 因此,如果我有这样一个查询,例如: $var1 = $_POST['userInput1']; $var1 = $_POST['userInput2']; $stmt = $db->prepare("INSERT INTO tableName (Column1

根据我目前的理解,将用户输入插入数据库的风险是sql注入,由准备好的语句处理,根据我所阅读的内容,在使用
htmlspecialchars()等函数将数据保存到数据库之前,不应更改数据
从页面上的数据库回显用户输入时,应始终使用此选项

因此,如果我有这样一个查询,例如:

$var1 = $_POST['userInput1'];
$var1 = $_POST['userInput2'];

$stmt = $db->prepare("INSERT INTO tableName (Column1, Column2) VALUES (?, ?)");
$stmt->bindParam(1, $var1);
$stmt->bindParam(2, $var2);
$stmt->execute();
撇开验证不谈,这个变量还有什么需要做的吗?或者从这一点开始,用户在安全中输入并可以存储的任何内容


另外,我应该使用命名占位符而不是位置占位符,还是这只是一个优先事项

正如我看到的,您从用户处获取两个输入并将其放入数据库中, 在我看来,您的数据必须至少通过这两个过程

  • 清理数据
  • 验证数据
  • 正如您所见,我在验证之前编写了“消毒”,这是最重要的原因

    //If You Want The Output after Validation and Sanitize "Hello" as string and 5 length chars. 
    $userInput = "Hel<script></script>";
    
    我的意思是,你必须先清理你的数据,然后检查它的有效性

    Php有很好的内置函数用于 并进行验证

    还有一些其他工具,如将特定变量转换为特定类型的数据


    我希望这有帮助

    在将变量用作准备状态的参数之前,无需对其进行任何处理

    事实上,您不能做任何转义字符串、引号或任何事情,因为反斜杠或任何东西都会被直接插入到您的数据库中

    您可能还喜欢PDO的简单用法。您不需要使用bindParam(),只需传递一个值数组以执行():

    关于您关于命名参数占位符的问题:

    这没什么区别,它只是一件方便的事情,可以帮助您编写更可读的代码。您仍然可以使用传递值数组的简短形式:

    $stmt = $db->prepare("INSERT INTO tableName (Column1, Column2) VALUES (:col1, :col2)");
    $stmt->execute(['col1'=>$var1, 'col2'=>$var2]);
    
    如果您已经有了一个具有正确的键/值对的哈希数组,比如
    $\u POST
    数组,那么它会特别方便。我们很容易做到以下几点:

    $stmt = $db->prepare("INSERT INTO tableName (Column1, Column2) VALUES (:userInput1, :userInput2)");
    $stmt->execute($_POST);
    

    但是要注意这一点,因为你不能假设
    $\u POST
    只有你需要的字段。如果向PDO传递的数组包含过多字段,或者字段的键名与参数占位符不匹配,PDO将抛出错误。因此,任何人都可以提出一个会导致您的应用程序出错的请求。

    次要挑剔:您应该引用您的查询,并关闭其后面的括号。“是否需要对该变量执行其他操作?”。。。不-我认为你很好,如果你想具体说明,你可以设置数据类型(例如,
    PDO::PARAM_INT
    ),但是…这是我的SQL注入示例参考:需要注意的一点是,以这种方式写入db很好,但是在回显到web站点时,你应该使用
    htmlspecialchars()
    对,但这是为了防止XSS漏洞,而不是SQL注入。这些是最常见的web应用程序漏洞的1号和2号!
    $stmt = $db->prepare("INSERT INTO tableName (Column1, Column2) VALUES (:col1, :col2)");
    $stmt->execute(['col1'=>$var1, 'col2'=>$var2]);
    
    $stmt = $db->prepare("INSERT INTO tableName (Column1, Column2) VALUES (:userInput1, :userInput2)");
    $stmt->execute($_POST);