如何使访问SQL的PHP代码段安全? 问题
我现在正在建立一个网站,上面有下面的片段。我知道它是不安全的,因为SQL注入等,但什么是正确的方法来解决这个问题?我看到相关的问题也在问同样的问题,但是MySQL有PDO,但是PDO_OCI是实验性的,所以我不想使用它 我还有其他选择吗?我是否只需要创建一个函数来去除某些字符,并将其环绕在如何使访问SQL的PHP代码段安全? 问题,php,sql,oracle,security,Php,Sql,Oracle,Security,我现在正在建立一个网站,上面有下面的片段。我知道它是不安全的,因为SQL注入等,但什么是正确的方法来解决这个问题?我看到相关的问题也在问同样的问题,但是MySQL有PDO,但是PDO_OCI是实验性的,所以我不想使用它 我还有其他选择吗?我是否只需要创建一个函数来去除某些字符,并将其环绕在$\u POST,类似于str\u replace(“;”,“”,$\u POST['username') 下面的代码片段是网站中唯一一个在查询中实际接受用户输入的部分,$\u POST,因此我只需要确保下面的
$\u POST
,类似于str\u replace(“;”,“”,$\u POST['username')代码>
下面的代码片段是网站中唯一一个在查询中实际接受用户输入的部分,$\u POST
,因此我只需要确保下面的内容是正确的
代码
一个快速生成的,看起来可以用来创建参数化查询(即正确的方式™).
根据该页面上的示例推断,您很可能会将代码更改为(未经测试,但很可能是正确的):
这样,您的用户输入将永远不会与SQL语句混合。哦,我真的希望密码不是像看起来那样以纯文本形式出现的…:'-(PDO_OCI
工作起来很有魅力。我们也在工作中使用它。或者,如果PDO违反你的宗教信仰或其他什么,你可以使用OCI_按名称绑定参数…@Uriel_SVK如何OCI_按名称绑定
停止SQL注入?@user3636943你可以在Ic的答案中看到它,如果你需要它如何工作的详细信息,请阅读文档。谢谢。我刚刚重新写了这篇文章,看了看《oci_bind_by_name》(/code>),想到了几乎相同的东西,但我仍然不明白这有什么帮助。:username
可能是一个实际的用户名,但是如果:password
是password;DROP…
那么这是否等于和password=passwor呢d、 删除…
?因为在参数化查询中,参数的值没有与语句混合在一起;它被严格视为数据。有关更多详细信息,请参阅的“解释”部分。无论RDBMS、库或实现如何,基本概念都是相同的。
<?php
if (!empty($_POST)) {
$stid = oci_parse($conn, "SELECT CustomerNo FROM Customers WHERE Username = '" . $_POST['username'] . "' AND Password = '" . $_POST['password'] . "'");
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_NUM);
if (!empty($row['0'])) {
session_start();
$_SESSION['customer'] = $row['0'];
$_SESSION['username'] = $_POST['username'];
}
oci_free_statement($stid);
oci_close($conn);
}
?>
<?php
if (!empty($_POST)) {
$stid = oci_parse($conn, 'SELECT CustomerNo FROM Customers WHERE Username = :username AND Password = :password');
oci_bind_by_name($stid, ':username', $_POST['username']);
oci_bind_by_name($stid, ':password', $_POST['password']);
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_NUM);
if (!empty($row['0'])) {
session_start();
$_SESSION['customer'] = $row['0'];
$_SESSION['username'] = $_POST['username'];
}
oci_free_statement($stid);
oci_close($conn);
}
?>