Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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中的SQL注入_Php_Sql Injection - Fatal编程技术网

避免PHP中的SQL注入

避免PHP中的SQL注入,php,sql-injection,Php,Sql Injection,我读过关于db注入的文章“直到我眼睛发红,论坛搜索,命名搜索小姐…”。。。。这是一个直截了当的问题。我正在使用jquery/ajax var characterReg = /^([0-9a-zA-NP-Z]{27,34})$/; 仅用于基本格式验证。这将传递给php。在DB查询中使用结果安全吗?我不是在寻找实际的比特币地址验证,只是寻找基本的格式 <?php include('myConnect.php'); $expire = time() + 60 * 60 * 24 * 30; $

我读过关于db注入的文章“直到我眼睛发红,论坛搜索,命名搜索小姐…”。。。。这是一个直截了当的问题。我正在使用jquery/ajax

var characterReg = /^([0-9a-zA-NP-Z]{27,34})$/;
仅用于基本格式验证。这将传递给php。在DB查询中使用结果安全吗?我不是在寻找实际的比特币地址验证,只是寻找基本的格式

<?php
include('myConnect.php');
$expire = time() + 60 * 60 * 24 * 30;
$path   = '/';
if (isset($address)) {
    // Query db if address exsists.
    $data = mysql_query("SELECT * FROM viewers WHERE address = '$address'");
    $info = mysql_fetch_array($data);
    if ($info) {
        // Build cookie data from db row array.
        $bitAdrr = $info['address'];
        $id    = $info['id'];
        $earn  = $info['earnings'];
        $track = $info['tracking'];
        setcookie('user', $bitAdrr . ',' . $id . ',' . $earn . ',' . $track, $expire);
    } else {
        echo 'empty';
    }
}
?>
最好的答案是使用,这让数据库引擎担心正确的转义

PHP手册中提供了完整的详细信息,但概要是您首先要准备的是,为变量提供一个带有问号占位符的语句模板:

$stmt = $mysqli->prepare("SELECT * FROM viewers WHERE address = ?")
然后,您可以提供要替换的参数:

$stmt->bind_param("s", $address)
然后最后执行它:

$stmt->execute();

另一个需要注意的方面是,您似乎试图在客户端(JavaScript)而不是服务器端(PHP)进行验证。这是不安全的,因为您无法验证所有请求是否来自页面上运行的代码;由于代码在我的浏览器中运行,我可以简单地选择不运行它,并使用我喜欢的任何地址值直接向您的服务器发送请求。始终在服务器端实现数据验证。

对于ajax文章,“看起来您正在尝试在客户端进行验证”。不是php。服务器完全不知道我对这个字符串的期望。对不起,你很好,但是你看到代码中有可能被黑客攻击的问题吗?如果你问的是“请对此代码进行安全审查”,那么这个问题对于StackOverflow来说太本地化了;这里的问题通常适用于广泛的受众,我给出的一般建议是“通过使用准备好的语句应用PHP手册中建议的最佳实践”。在我花了两分钟时间盯着你的代码看的时候,我没有发现问题,但我不明白为什么你会坚持这样一个冒险的策略,因为有了一个更健壮的解决方案,需要你编写的代码更少。看起来它消除了所有最明显的SQL注入攻击,是的。然而,即使这些代码是目前编写的完美代码,该代码的未来维护者也很容易将其搞糟;使用框架中内置的安全机制可以简化代码并使其更易于安全维护。因为这是一个问答网站,而不是一个讨论论坛,所以我不会进一步讨论这个问题。对不起,如果您在代码库中使用mysql\u查询,那么默认情况下,您的程序很容易被注入。Mysql_查询因其漏洞而被弃用。请参阅“停止尝试放弃使用参数化查询的正确操作”顶部的警告。就像你在说“嘿,我可以不系安全带开车走这条路吗?”而答案就是系上安全带。你为什么要担心文本转换代码的“速度”会有多慢,而与数据库对话的运行时会让它相形见绌呢?不,谢谢你。当我在我的windo$e机器上运行它时,它会滞后。你能注射这个吗?抱歉,大量的快速回复让我有点不知所措。谢谢。@user2180814从address='
'和1=1的查看器中选择*--'仅作为一个例子。我向您保证,无论您遇到什么速度问题,都不是由调用
mysql\u real\u escape\u string
引起的。使用代码配置文件工具(如XDebug)查找真正的问题所在。
$stmt->execute();