Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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 高效安全的查询idea-mysql_Php_Mysql_Security_Sql Injection - Fatal编程技术网

Php 高效安全的查询idea-mysql

Php 高效安全的查询idea-mysql,php,mysql,security,sql-injection,Php,Mysql,Security,Sql Injection,比方说,我想创建一个登录查询: $query ="SELECT * FROM userstable WHERE uName='".$userName."' AND pass='".$password."' "; $result = mysql_query($query); $num = mysql_numrows($result); if ($num == 0) { echo "wrong detiales"; } else { echo "in"; 但是通过这种方式,客户可以访问并将他的

比方说,我想创建一个登录查询:

$query ="SELECT * FROM userstable WHERE uName='".$userName."' AND pass='".$password."' ";
$result = mysql_query($query);

$num =  mysql_numrows($result);
if ($num == 0) {
echo "wrong detiales";
}
else
{
echo "in";
但是通过这种方式,客户可以访问并将他的数据放入我的查询中。。。 我不喜欢它。。。为什么要让客户端访问我的数据库获取数据

问题:将数据放入数组,然后搜索数组而不是搜索查询是否健康? 它可能会慢一点(比如说我没有很多记录)。 即使它稍微慢一点,它会更安全吗

还有什么建议?代码示例

10倍, (顺便说一句,我非常喜欢这个网站!)

将数据放在数组中,然后搜索数组而不是搜索查询,这样是否健康

不 这将破坏数据库的整体功能。其主要目的是为您提供所需的唯一数据,并在其中进行所有数据挖掘。这就是重点

所以,这是不可接受的解决方案。虽然安全,但它绝对低效且不可靠

幸运的是,已经有了一种正确的方法来运行安全的查询-准备好的语句。您可以在中阅读它们,并从

也就是说,你必须做到这一点

$query = "SELECT 1 FROM userstable WHERE uName=? AND pass=?";
$stmt  = $pdo->prepare($query);
$stmt->execute(array($userName, $password));
$found = $stmt->fetchColumn();
if (!$found)
{
    echo "wrong detiales";
}
else
{
    echo "in";
}

我建议使用mysqli或PDO并进行查询准备……很荣幸认识到这是一个安全问题。这实际上有一个技术术语,“SQL注入”。有一个比我多一点空闲时间的人可能会写出一个好的答案,但在此期间,谷歌搜索这个词应该会让你对这个主题有足够的阅读。使用客户机提供的值运行查询与选择所有记录,然后将它们与客户机值进行比较有什么区别您是对的,您将自己完全暴露在SQL注入攻击面前。此外,任何带有单引号的输入数据,如“O'Malley”的名称,都会破坏您的SQL查询。请了解如何使用参数化查询(最好是PDO模块)来保护您的web应用程序。有例子让你开始。谢谢你的回复!由于某些原因,我必须将此代码部署到无法运行准备好的语句的服务器上。所以我必须要有创造性。总是有办法运行准备好的语句。因此,你确实必须要有创造力——让它们成为现实。