标签: sql-injection

如何在PHP中阻止SQL注入?

如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:

$unsafe_variable = $_POST['user_input']; 

mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)

这是因为用户可以输入类似的内容value'); DROP TABLE table;--,查询变为:

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)

可以采取哪些措施来防止这种情况发生?

php mysql sql security sql-injection

2776
推荐指数
28
解决办法
166万
查看次数

如何从"Bobby Tables"XKCD漫画中注入SQL?

只看:

XKCD Strip (来源:https://xkcd.com/327/)

这个SQL做了什么:

Robert'); DROP TABLE STUDENTS; --
Run Code Online (Sandbox Code Playgroud)

我知道这两个'并且--是用于评论,但是这个词也没有DROP被评论,因为它是同一行的一部分?

security validation sql-injection

1070
推荐指数
13
解决办法
19万
查看次数

用PHP清理用户输入的最佳方法是什么?

是否有一个catchall函数适用于清理SQL注入和XSS攻击的用户输入,同时仍允许某些类型的html标记?

php security xss user-input sql-injection

1069
推荐指数
14
解决办法
50万
查看次数

PDO准备好的语句是否足以阻止SQL注入?

假设我有这样的代码:

$dbh = new PDO("blahblah");

$stmt = $dbh->prepare('SELECT * FROM users where username = :username');
$stmt->execute( array(':username' => $_REQUEST['username']) );
Run Code Online (Sandbox Code Playgroud)

PDO文件说:

准备语句的参数不需要引用; 司机为你处理.

这真的是我需要做的就是避免SQL注入吗?这真的很容易吗?

如果它有所作为,你可以假设MySQL.另外,我真的只是对使用针对SQL注入的预处理语句感到好奇.在这种情况下,我不关心XSS或其他可能的漏洞.

php security pdo sql-injection

631
推荐指数
6
解决办法
20万
查看次数

围绕mysql_real_escape_string()的SQL注入

即使使用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'";
Run Code Online (Sandbox Code Playgroud)

我听过很多人对我说,这样的代码仍然很危险,即使使用了mysql_real_escape_string()函数也可以破解.但我想不出任何可能的漏洞?

像这样的经典注射:

aaa' OR 1=1 --
Run Code Online (Sandbox Code Playgroud)

不工作.

你知道任何可能通过上面的PHP代码注入的注入吗?

php mysql sql security sql-injection

596
推荐指数
4
解决办法
22万
查看次数

准备好的语句如何防止SQL注入攻击?

准备语句如何帮助我们防止SQL注入攻击?

维基百科说:

准备好的语句对SQL注入具有弹性,因为稍后使用不同协议传输的参数值无需正确转义.如果原始语句模板不是从外部输入派生的,则不能进行SQL注入.

我看不清楚原因.简单的英语和一些例子中有什么简单的解释?

sql security sql-injection prepared-statement

151
推荐指数
5
解决办法
10万
查看次数

Java - 转义字符串以防止SQL注入

我试图在java中放入一些反sql注入,并且发现很难使用"replaceAll"字符串函数.最后,我需要将任何现有的转换功能\\\,任何"\",任何'\',任何\n\\n使得当字符串由MySQL的SQL注入评估将被阻止.

我已经搞砸了一些我正在使用的代码,所有\\\\\\\\\\\功能都让我的眼睛变得疯狂.如果有人碰巧有这样的例子我会非常感激.

java regex sql sql-injection escaping

142
推荐指数
9
解决办法
24万
查看次数

我可以通过使用单引号转义单引号和周围用户输入来防止SQL注入吗?

我意识到参数化SQL查询是构建包含用户输入的查询时消毒用户输入的最佳方式,但我想知道使用用户输入并转义任何单引号并用单引号包围整个字符串有什么问题.这是代码:

sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'"
Run Code Online (Sandbox Code Playgroud)

用户输入的任何单引号都被双单引号替换,这消除了用户结束字符串的能力,因此他们可能键入的任何其他内容(例如分号,百分号等)都将成为字符串的一部分而不是实际上作为命令的一部分执行.我们使用的是Microsoft SQL Server 2000,我相信单引号是唯一的字符串分隔符,也是逃避字符串分隔符的唯一方法,因此无法执行用户键入的任何内容.

我没有看到任何方法发起针对此的SQL注入攻击,但我意识到,如果这是像我看来一样的防弹,其他人会想到它,这将是常见的做法.我的问题是:这段代码有什么问题?有没有人知道通过这种清理技术获得SQL注入攻击的方法?利用此技术的示例用户输入将非常有用.

更新:

感谢大家的回答; 几乎我在研究中遇到的所有信息都出现在这个页面的某个地方,这表明那些在忙碌的日子里抽出时间帮助我解决这个问题的人的智慧和技巧.

我还没有接受任何答案的原因是我仍然不知道如何有效地针对此代码启动SQL注入攻击.有些人建议反斜杠会转义一个单引号而另一个引用字符串结束,以便字符串的其余部分作为SQL命令的一部分执行,我意识到这个方法可以将SQL注入一个mySQL数据库,但在MS SQL 2000中,唯一的方法(我能够找到)逃避单引号是另一个单一的qoute; 反斜杠不会这样做.除非有办法停止单引号的转义,否则其余的用户输入都不会被执行,因为它将全部作为一个连续的字符串.

我知道有更好的方法来消毒输入,但我真的更有兴趣了解为什么我上面提供的方法不起作用.如果有人知道对这种清理方法进行SQL注入攻击的任何特定方法,我很乐意看到它.

sql security sanitization sql-injection sql-server-2000

131
推荐指数
9
解决办法
7万
查看次数

htmlspecialchars和mysql_real_escape_string能保证我的PHP代码免于注入吗?

今天早些时候,有人询问有关网络应用中输入验证策略的问题.

在撰写本文时,最重要的答案建议PHP只使用htmlspecialcharsmysql_real_escape_string.

我的问题是:这总是足够的吗?还有更多我们应该知道的吗?这些功能在哪里崩溃?

php security xss sql-injection

115
推荐指数
2
解决办法
6万
查看次数

当参数不是字符串时,不参数化SQL查询是否安全?

SQL注入方面,我完全理解参数化string参数的必要性; 这是本书中最古老的技巧之一.但什么时候可以证明参数化SqlCommand?是否认为任何数据类型不安全参数化?

例如:我不认为自己在SQL专家附近,但我不能想到任何可能容易受到SQL注入接受a bool或an int并且只是将其连接到查询中的情况.

我的假设是正确的,还是可能在我的程序中留下一个巨大的安全漏洞?

为了澄清,这个问题被标记为,这是一种强类型语言; 当我说"参数"时,想一想 public int Query(int id).

c# sql sql-injection sqlcommand parameterized-query

113
推荐指数
9
解决办法
9160
查看次数