执行SQL查询时,必须清理字符串,否则用户可以在您的网站上执行恶意SQL。

我通常只有一个函数escape_string(blah),它:

  • 替换逃逸( \\ )与双逃逸( \\\\ )。
  • 替换单引号( ' )与一个转义的单引号( \\' )。

这够了吗? 我的代码中有漏洞吗? 有没有一个库可以快速可靠地为我做到这一点?

我想在Perl,Java和PHP中看到优雅的解决方案。

===============>>#1 票数:8 已采纳

为了最大限度地提高安全性,性能和正确性,请使用预先准 以下是使用不同语言(包括PHP)的大量示例执行此操作的方法:

https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks

===============>>#2 票数:2

我也会逃避评论(双击)

--

===============>>#3 票数:1

在PHP中使用的一件好事是PDO 处理保护SQL(以及一般的所有SQL内容)需要花费大量的猜测。 它支持预处理语句,这对于阻止SQL注入攻击有很大帮助。

关于PDO的一很好的入门书包含在Davey Shafik的书“ The PHP Anthology 101 Essential Tips,Tricks&Hacks”等第二版中 让学习成为一件轻而易举的事,并作为参考。 除了实际的SQL查询之外,我甚至不需要考虑任何其他事情。

===============>>#4 票数:0

MySQL C API拥有自己的mysql_escape_string() 使用它或它的等价物是最好的。

===============>>#5 票数:0

在MySQL查询中,当使用LIKE时,还要确保转义“_”字符,因为它没有被mysql_real_escape_string转义。

如需参考,请点击此处

===============>>#6 票数:0

使用哪种语言? 看起来几乎所有这些都具有内置的SQL转义函数,可以更好地使用。

例如,PHP有mysql_real_escape_stringaddslashes

===============>>#7 票数:0

最好将准备好的语句与占位符一起使用。 您使用的是PHP,.NET ......无论哪种方式,预处理语句都会提供更多安全性,但我可以提供样本。

===============>>#8 票数:0

在PHP中,我正在使用这个,我会感谢每一条评论:

function quote_smart($valeur) 
{ 
    if (get_magic_quotes_gpc()) 
        $valeur = stripslashes($valeur); 

    if (!is_numeric($valeur)) 
        $valeur = mysql_real_escape_string($valeur); 

    return $valeur; 
}


$IdS = quote_smart($_POST['theID']); 
$sql = " 
SELECT * FROM Students 
WHERE IdStudent={$IdS}; 
";

如果字段可以为NULL,则需要再验证一次:

$picture = NULL;
$theidyouwant = 7;
$Name = 'WOOD';


if(is_null($picture)) 
    $p = 'NULL'; 
else
    $p = "'".quote_smart($picture)."'"; 

$IdS = quote_smart($theidyouwant);

$requete = "SELECT * FROM Students
    WHERE IdStudent={$IdS} AND
    PictureStudent={$p} AND
    NameStudent='{$Name}';
    ";

这很有趣! (希望帖子能正确发送下划线而不是_)

===============>>#9 票数:0

使用准备/参数化查询!

===============>>#10 票数:0

使用预备陈述。

===============>>#11 票数:-1

我不确定MySql是否支持参数化查询,如果是这样,你应该努力走这条路。 这将确保用户输入不能做任何恶意的事情。

否则,除了你提到的内容之外,一些“坏”字符将是分号(;)和注释( - 和/ * * /)。

  ask by andrewrk translate from so

未解决问题?本站智能推荐:

2回复

这是转义SQL查询参数的安全方法吗?

在我的工作中,通过不安全地将参数串联到查询字符串中来形成SQL查询是一种传统。 当然,这会导致SQL注入漏洞。 这不是一个大问题,因为所有发生这种情况的Java软件都在假定所有用户都受信任的封闭网络上运行。 而且,查询是从具有数据库访问权限的客户端应用程序执行的,因此用户无论如何在技术上都
4回复

如何启用自动mysql真正逃避所有查询?

我正在运行php 5.2.13并且我有一个包含大量文件的应用程序,但它们都在开始时调用一个文件,我想在该文件中放一些行以自动mysql真正转义任何查询,因为我不想要浏览每个文件并更改代码。 谢谢!
2回复

Oracle:我需要在序列上授予哪些权限?

我的数据库中有一个新序列。 我需要向Web用户授予哪些权限才能使用序列? 我尝试在序列上授予选择权,但网络用户似乎仍然无法看到它。
2回复

将DML / DDL嵌入为子查询?

在我的团队正在开发的应用程序中,所有用户都可以定义基于SQL的筛选器,即返回ID的SQL选择语句。 用户输入的该语句然后作为子选择子句嵌入到insert ... select ..语句中。 我对此感觉很不好,并且我认为这是一个严重的安全问题,因为用户可能会找到一种执行危险的任意SQL命令
1回复

为了避免SQL注入,Oracle SQL中需要转义哪些字符?

只想确认在Oracle SQL中需要转义哪些字符以避免SQL注入? 到目前为止,我只发现这篇文章似乎可以回答我的问题: https : //ss64.com/ora/syntax-escape.html 。 然而,正如我一声,双耳罐“@”字符也需要转义,因此,我认为上面的文章有需要转义字符不
2回复

是在服务器还是客户端上处理Oracle Db查询信息?

我们正在讨论有关数据安全性的问题,我需要确认一个问题。 这是方案: 我们有两个Oracle数据库:一个在源服务器上,一个在客户端服务器上。 源服务器具有敏感信息,并已完全安全并被认为合规。 我们希望group by查询来运行一个group by以汇总来自源的数据并将其存储在客户端上,
1回复

是否可以使用DBD :: Oracle在单个查询中执行多个语句?

我想知道是否可以通过Perl DBI使用DBD::Oracle在单个execute()或do()调用中执行多个SQL语句。 例: 我之所以这样问并不是因为我实际上想做这样的事情,而是因为我想通过一次成功的SQL注入攻击来评估可能造成的损害。 是的,我知道,无论对该问题的答案如何,都必
5回复

在客户端 - 服务器应用程序中:如何向数据库发送用户的应用程序密码?

我有一个Java桌面应用程序,它直接与DB(Oracle)连接。 该应用程序有多个用户帐户。 通过网络发送用户密码(而不是DB密码)的正确方法是什么? 我不想以纯文本发送它
1回复

从SELECT执行软件包时出现ORA-00904

尝试设置特定的安全测试用例。 这个想法是创建一个可以使用select语句从PL / SQL调用的程序包。 该程序包可以工作并创建表,但是当我在Oracle SQL Developer中SELECT evil_pkg.CreateTab() FROM DUAL运行SELECT evil_pkg
1回复

尝试下载Java JDK时发生SSL错误[关闭]

我需要下载特定版本的Java JDK,因此我将转到Oracle的网站进行下载。 当我单击任何链接开始下载JDK时,我从浏览器中收到以下错误消息: 这可能不是您要查找的网站! 您试图访问download.oracle.com,但实际上是到达一台将其自身标识为a248.e.aka