Questions tagged «sql-injection»

SQL注入是一种代码注入技术,用于攻击数据驱动的应用程序,其中将恶意SQL语句插入到输入字段中以执行(例如,将数据库内容转储给攻击者)

28
如何防止PHP中进行SQL注入?
这个问题的答案是社区的努力。编辑现有答案以改善此职位。它目前不接受新的答案或互动。 НаэтотвопросетьответынаStack Overflowнарусском:КакимобразомизбежатьSQL-инъекцийвPHP? 如果将用户输入未经修改地插入到SQL查询中,则该应用程序容易受到SQL注入的攻击,如以下示例所示: $unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')"); 这是因为用户可以输入类似的内容value'); DROP TABLE table;--,并且查询变为: INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--') 如何防止这种情况的发生?



7
PDO准备好的语句是否足以防止SQL注入?
假设我有这样的代码: $dbh = new PDO("blahblah"); $stmt = $dbh->prepare('SELECT * FROM users where username = :username'); $stmt->execute( array(':username' => $_REQUEST['username']) ); PDO文档说: 准备好的语句的参数不需要用引号引起来。司机为您处理。 那真的是我避免SQL注入所需要做的一切吗?真的那么容易吗? 您可以假设MySQL会有所作为。另外,我真的只是对针对SQL注入使用准备好的语句感到好奇。在这种情况下,我不在乎XSS或其他可能的漏洞。

4
SQL注入绕过mysql_real_escape_string()
即使使用mysql_real_escape_string()函数,是否存在SQL注入的可能性? 考虑这种示例情况。SQL是用PHP构造的,如下所示: $login = mysql_real_escape_string(GetFromPost('login')); $password = mysql_real_escape_string(GetFromPost('password')); $sql = "SELECT * FROM table WHERE login='$login' AND password='$password'"; 我听到很多人对我说,这样的代码仍然很危险,即使使用了mysql_real_escape_string()函数也可能被黑。但是我想不出任何可能的利用方式? 像这样的经典注射: aaa' OR 1=1 -- 不工作。 您是否知道上面的PHP代码会进行任何可能的注入?

9
准备好的语句如何防止SQL注入攻击?
准备好的语句如何帮助我们防止SQL注入攻击? 维基百科说: 准备好的语句可以抵御SQL注入,因为稍后需要使用其他协议传输的参数值不需要正确地转义。如果原始语句模板不是从外部输入派生的,则不会发生SQL注入。 我不太清楚原因。用简单的英语和一些例子,简单的解释是什么?

12
Java-转义字符串以防止SQL注入
我试图在Java中放置一些反SQL注入,并发现使用“ replaceAll”字符串函数非常困难。最后,我需要,将转换现有的功能\来\\,任何"到\",任何'到\',任何\n以\\n使得当字符串由MySQL的SQL注入评估将被阻止。 我已经整理了一些正在使用的代码,并且\\\\\\\\\\\该函数中的所有内容都使我大失所望。如果有人碰巧有这个例子,我将不胜感激。

18
我可以通过转义单引号和用单引号引起来的用户输入来防止SQL注入吗?
我意识到,在构建包含用户输入的查询时,参数化SQL查询是清理用户输入的最佳方式,但是我想知道使用用户输入并转义任何单引号并将整个字符串都用单引号引起的问题是什么。这是代码: sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'" 用户输入的任何单引号都将替换为双单引号,这消除了用户结束字符串的能力,因此他们可能键入的其他任何内容(例如分号,百分号等)都将成为字符串的一部分,并且实际上并未作为命令的一部分执行。 我们使用的是Microsoft SQL Server 2000,我认为单引号是唯一的字符串定界符,也是逃避字符串定界符的唯一方法,因此无法执行用户键入的任何内容。 我没有发现针对此问题发起SQL注入攻击的任何方法,但我意识到,如果这在我看来像防弹一样,那么其他人可能已经想到了,并且这将是普遍的做法。 此代码有什么问题?有没有办法使SQL注入攻击超越这种清理技术?利用此技术的样本用户输入将非常有帮助。 更新: 我仍然不知道有什么方法可以有效地对此代码发起SQL注入攻击。一些人建议反斜杠可以转义一个单引号,而让另一个反引号结束该字符串,以便该字符串的其余部分将作为SQL命令的一部分执行,并且我意识到该方法可以将SQL注入到一个MySQL数据库,但是在SQL Server 2000中,唯一能够逃脱单引号的方法是使用另一个单引号。反斜杠不会这样做。 并且,除非有一种方法可以停止转义单引号,否则将不会执行其余的用户输入,因为所有这些都将被视为一个连续的字符串。 我知道有更好的方法可以清除输入,但是我真的更感兴趣于了解为什么我上面提供的方法行不通。如果有人知道针对此清理方法进行SQL注入攻击的任何特定方式,我很乐意看到它。



7
为什么我们总是喜欢在SQL语句中使用参数?
我对使用数据库非常陌生。现在我可以写SELECT,UPDATE,DELETE,和INSERT命令。但是我看过很多我们喜欢写的论坛: SELECT empSalary from employee where salary = @salary ...代替: SELECT empSalary from employee where salary = txtSalary.Text 为什么我们总是喜欢使用参数,我将如何使用它们? 我想知道第一种方法的用途和好处。我什至听说过SQL注入,但我并不完全了解。我什至不知道SQL注入是否与我的问题有关。

12
当参数不是字符串时,不对SQL查询进行参数化是否安全?
在SQL注入方面,我完全理解了参数化string参数的必要性。那是书中最古老的把戏之一。但是什么时候可以证明不对参数进行参数化SqlCommand呢?是否将任何数据类型视为“安全的”而不进行参数化? 例如:我不会认为自己是SQL专家附近的任何地方,但是我无法想到在任何情况下都可能容易接受SQL注入以接受a bool或an int并将其直接连接到查询中。 我的假设是正确的,还是可能在程序中留下巨大的安全漏洞? 为了澄清起见,标记了这个问题 C#这是一种强类型的语言;当我说“参数”时,请想一想 public int Query(int id)。

21
避免不带参数的SQL注入
在这里,我们正在讨论在代码中使用参数化的sql查询的另一种讨论。在讨论中,我们有两个方面:我和其他一些人说我们应该始终使用参数来防止sql注入,而其他人则认为不需要。相反,他们希望在所有字符串中用两个撇号替换单个撇号,以避免sql注入。我们的数据库都运行Sql Server 2005或2008,我们的代码库在.NET Framework 2.0上运行。 让我给您一个简单的C#示例: 我希望我们使用这个: string sql = "SELECT * FROM Users WHERE Name=@name"; SqlCommand getUser = new SqlCommand(sql, connection); getUser.Parameters.AddWithValue("@name", userName); //... blabla - do something here, this is safe 其他人想这样做时: string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name); SqlCommand getUser = new SqlCommand(sql, …

11
如果使用下拉菜单,是否必须防止SQL注入?
我知道您绝不应该信任表单中的用户输入,这主要是由于SQL注入的机会。 但是,这是否也适用于唯一输入来自下拉菜单的表单(请参见下文)? 我将其保存$_POST['size']到一个Session中,然后在整个站点中使用它来查询各种数据库(使用mysqliSelect查询),任何SQL注入肯定会损害(可能会删除)它们。 没有类型输入的用户输入可以查询数据库的区域,只有下拉列表。 <form action="welcome.php" method="post"> <select name="size"> <option value="All">Select Size</option> <option value="Large">Large</option> <option value="Medium">Medium</option> <option value="Small">Small</option> </select> <input type="submit"> </form>

5
防止在Node.js中进行SQL注入
是否有可能以与PHP具有防止它们攻击的Prepared语句相同的方式来防止在Node.js(最好是使用模块)中进行SQL注入。 如果是这样,怎么办?如果没有,那么有哪些示例可以绕过我提供的代码(请参见下文)。 一些上下文: 我正在使用node-mysql模块制作一个包含Node.js + MySql的后端堆栈的Web应用程序。从可用性的角度来看,该模块很棒,但是它尚未实现类似于PHP的Prepared Statements的功能(尽管我知道它在待办事项上)。 据我了解,PHP对预准备语句的实现以及其他方面极大地有助于防止SQL注入。不过,我担心我的node.js应用程序可能会遭受类似的攻击,即使默认情况下提供了字符串转义(如下面的代码片段)。 node-mysql似乎是node.js最受欢迎的mysql连接器,所以我想知道其他人可能正在做些什么(如果有的话)来解决这个问题-甚至从头开始它甚至是node.js的问题(由于涉及到用户/客户端输入,因此不确定如何实现)。 我是否应该暂时切换到node-mysql-native,因为它确实提供了准备好的语句?我很犹豫,因为它似乎不像node-mysql那样活跃(尽管这可能意味着它已经完成了)。 这是用户注册代码的一部分,该代码使用了sanitizer模块,以及node-mysql预先准备的类似于语句的语法(如上所述,它进行字符转义),以防止跨站点脚本和sql注入: // Prevent xss var clean_user = sanitizer.sanitize(username); // assume password is hashed already var post = {Username: clean_user, Password: hash}; // This just uses connection.escape() underneath var query = connection.query('INSERT INTO users SET ?', post, function(err, results) { // …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.