Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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
Base64作为清理Mysql用户输入的方法_Mysql_Input - Fatal编程技术网

Base64作为清理Mysql用户输入的方法

Base64作为清理Mysql用户输入的方法,mysql,input,Mysql,Input,我认为,保证用户输入是mysql安全的唯一方法是使用白名单,其中只允许mysql安全输入,或者将输入编码为总是返回mysql安全的内容。Base64接缝对我来说就像这种编码的一个候选者,还有mysql\u escape\u字符串。。。除了用户可读性之外,还有什么原因不应该使用Base64进行输入?这被认为是坏习惯吗?我也有一种感觉,如果问题是由mysql处理的,而不是依靠单个程序员来确保数据的安全,那么为确保适当的安全而对用户数据进行的所有过滤都会更容易实现。。。例如,通过使用单个函数而不是基于

我认为,保证用户输入是mysql安全的唯一方法是使用白名单,其中只允许mysql安全输入,或者将输入编码为总是返回mysql安全的内容。Base64接缝对我来说就像这种编码的一个候选者,还有mysql\u escape\u字符串。。。除了用户可读性之外,还有什么原因不应该使用Base64进行输入?这被认为是坏习惯吗?我也有一种感觉,如果问题是由mysql处理的,而不是依靠单个程序员来确保数据的安全,那么为确保适当的安全而对用户数据进行的所有过滤都会更容易实现。。。例如,通过使用单个函数而不是基于查询的字符串,使命令和用户输入在整个调用过程中保持分离

Like: mysql_query("SELECT * FROM Users WHERE username=","$userinput");
或者,可以使用编码:

$input = encode($_POST['UserInput']);
mysql_query("SELECT * FROM Users WHERE username='$input'");
不要总是将“清理”输入作为防止SQL注入的一种手段(1)。保持一致。是安全的。问题已经解决了

这种情况将是“安全”的功能。然而

除了用户可读性之外,还有什么原因不应该使用Base64进行输入?这被认为是坏习惯吗

这是一种糟糕的做法,存储base64编码的值(这样显示的查询可能会工作2)在更改存储的信息时会带来一些负面影响:它会破坏值的顺序,使信息不容易搜索,需要额外的“编码/解码”步骤,甚至会消耗更多的空间-哎哟

因此,虽然base64编码数据可能存在特定情况,但这种方法并不适合作为缓解这种情况的手段

。。如果问题是由mysql处理的,而不是依靠单个程序员来确保数据的安全,那么实现适当的安全性可能会更容易

问题是由于通过文本协议访问SQL,其中查询命令/形状和值是混合的。使用正确的转义技术(例如)可以通过确保转义信息来修复此问题,以便按照预期解析SQL文本-但是,与base64编码步骤不同,它实际上不会更改提供的信息

例如,通过使用单个函数而不是基于查询的字符串,使命令和用户输入在整个调用过程中保持分离

这个!占位符是普遍正确的方法,应予以鼓励。库/数据库支持的占位符;并通过其他方式进行模拟。正确的占位符使用消除了SQL注入和用户代码将值混合到SQL命令文本中的需要,这也使查询更易于编写和维护

为了防止“单个程序员”编写糟糕的查询,解决方案是防止特殊查询分散在代码中:将数据访问操作收集到数据库中(可能与ORM结合),只公开相关操作,确保在DAL中正确使用SQL。在更简单的项目中,DAL也是集中管理sanitation1和其他验证逻辑的业务规则的合适位置


1更准确地说:

  • 清理业务规则的值;这应该可以防止“错误信息”,例如用户名太短、包含受限字符或无法满足业务要求

  • 使用占位符来防止。这与将数据传输到SQL密切相关,与其中的信息无关



2虽然MySQL 5.6.1增加了编码,使得编码可以简单地在SQL命令文本中使用,但这仍然增加了一个额外的显式解码步骤,并在使用这种编码方案时使查询复杂化。这种base64方法根本没有必要,因为已经有行之有效的技术来防止SQL注入,并且在最初的问题中没有提出。

如果您不想使用准备好的语句,就像使用简单的方法一样


这是保护mysql不受用户输入影响的标准方法。不需要重新发明轮子。

不,不要使用base64编码来关闭SQL注入漏洞。首先,SQL注入不是一个需要解决的问题;已经解决了

最早的商业关系数据库版本(如DB2、Oracle、Sybase)已经解决了这一问题,所有这些提供的接口都支持准备语句,为绑定值使用占位符

MySQL自aleast以来就提供了“真正的转义字符串”功能,至少从15年前的3.x版开始(早在2000年)

真正的问题是开发人员忽略了他们编写的代码中的SQL注入漏洞。当这些漏洞被指出时,最常见的反应似乎是“哦,这段代码只是为了学习。我现在不需要担心这个。”他们通过编写易受攻击的代码来学习,并采用了这些糟糕的编码实践。他们分享他们新获得的知识,糟糕的编码实践的例子激增,新的程序员从这些糟糕的例子中学习,并采用同样的糟糕编码实践

避免SQL注入漏洞的最佳实践是将准备好的语句绑定值一起使用。这正是您在问题中提出的,将已知为“安全”的静态SQL文本与提供的潜在“不安全”值分开。这是编写代码的正确方法

(本讨论不涉及将潜在不安全值插入数据库的问题,也不涉及坏代码如何检索这些值并将其视为“安全”处理,而不是将其视为潜在“不安全”处理。)

你说得很对
$sqltext = "SELECT * FROM Users WHERE username= '" . mysql_real_escape_string($userinput) . "'"; 
mysql_query($sqltext);
    $name = "Joe Smith";
    $b64_name = base64_encode($name);
    $sql = "select * from users where username=from_base64('$b64_name');";