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