当我");--从输入字段发送到我的localhost PHP服务器时,它自动将其转换为
\"); -
这似乎很棒,除了我不知道这种行为是多么值得信赖.虽然它似乎避免了SQL注入,但我的开发环境与生产环境不同,我担心生产环境可能没有自动激活这种保护......
为什么PHP会这样做(转换输入而不必使用mysql_real_escape_string)?它总是这样做还是仅限于某些扩展?依赖此行为来阻止SQL注入是否安全?
我有这个代码:
$query = "select id from votes where username = '$user' and article_id = $this->id";
Run Code Online (Sandbox Code Playgroud)
我尝试使用此代码来清理它:
$query = sprintf("select id from votes where username = '$user' and article_id = $this->id",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
Run Code Online (Sandbox Code Playgroud)
但我得到mysql_real_escape行的这个错误:
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'mexautos'@'localhost' (using password: NO) in /home/mexautos/public_html/kiubbo/data/article.php on line 145 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/mexautos/public_html/kiubbo/data/article.php on line 145 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'mexautos'@'localhost' (using password: NO) in /home/mexautos/public_html/kiubbo/data/article.php on …Run Code Online (Sandbox Code Playgroud) 作为对TableName的MySqlParameter的反应,似乎MySQL的Connector/NET库不支持用户输入的表名,方式如下:
MySqlCommand cmd = new MySqlCommand("SELECT * FROM @table");
cmd.Parameters.AddWithValue("@table",TableNameFromUserInput);
Run Code Online (Sandbox Code Playgroud)
所以我试图找到另一种方式,但我找不到任何为我这样做的库.
当手动搜索如何执行此操作时,我找不到任何没有告诉您使用某些已定义库中的"预准备语句"的内容,无论语言是什么.
由于我对SQL的了解有限,我只认为有必要在用户输入周围添加反引号(`),然后检查输入是否有反引号 - 但我想确定.
当MySQL Connector不支持时,如何保护用户指定的表名不受SQL-Injection的影响?
如果我'在sql查询的变量中删除" "字符,则可以避免SQL注入.我使用的SQL查询是:
dbCommand = new OleDbCommand("update Table1 set PhoneNo = '" + phone + "' where Table1.Company = '" + company + "'", dbConnection);
dbCommand.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
我也以类似的方式使用SELECT sql查询:
dbReader = new OleDbCommand("select * from Table1 where Table1.Company = '" + company + "'", dbConnection).ExecuteReader();
dbReader.Read();
if (dbReader.HasRows)
{
//Do operations using dbReader["Company"]
}
Run Code Online (Sandbox Code Playgroud)
变量中是否还有其他可能导致SQL注入或其他风险的字符?我可以删除那些.有什么其他方法可以防止SQL注入或其他风险?
我一直想知道这可能是几个月了,但我仍然不知道答案,除了可能的速度表现.长话短说,为什么不在每个角色之间放一个反斜杠,而不是在所有这些PDO代码到处都有?
$String = $_POST["attack"]; // SOME THING' OR 1 = 1 --
$String = fFilter( $String ); // \S\O\M\E\ \T\H\I\N\G\'\ \O\R\ \1\ \=\ \1\ \-\-
Run Code Online (Sandbox Code Playgroud)
现在我还没有进入这个SQL的东西,所以我不能给出一个完美的例子,但基本上sql字符串应该看起来像这样的SELECT * FROM account WHERE id = '\S\O\M\E\ \T\H\I\N\G\'\ \O\R\ \1\ \=\ \1\ \-\-'东西似乎总是很安全,但我没有听说过任何人使用它,甚至为什么不使用它.我总是看到像过滤html等的东西不好,但我不明白为什么不只是过滤每一个字符.因为任何攻击都会像\a\t\t\a\c\k.
我想在上线之前检查自己.我在互联网上阅读了很多不同的东西,但我想知道这是否绝对保护我的SQL注入代码.如果没有,我需要添加或带走什么?
$idtoapprove = mysql_real_escape_string($_POST['idtoapprove']);
$getcity = $conn->prepare('SELECT city, state FROM needs WHERE ID=:idtoapprove');
$getcity->bindParam(':idtoapprove', $idtoapprove);
$getcity->execute();
$cityrow = $getcity->fetch();
$needcity = $cityrow['city'];
$needstate = $cityrow['state'];
echo "$needcity, $needstate";
Run Code Online (Sandbox Code Playgroud) 假设ColdFusion 10,0,13,287689和Oracle Database 11g企业版11.2.0.2.0 - 64位生产.
有了这个例子......
<cfquery name="q" datasource="ds">
update someTable set
#form.col#label = <cfqueryparam cfsqltype="cf_sql_varchar" value="#x#">
where id = <cfqueryparam cfsqltype="cf_sql_decimal" value="#id#">
</cfquery>
Run Code Online (Sandbox Code Playgroud)
还假设没有数据验证检查#form.col#,如何利用它?显然,它们可能会导致查询失败并显示无效列,但由于多个语句无法在单个语句中运行,因此我没有看到任何更恶意的行为<cfquery>.所以像这样的东西不起作用......
#form.col#:
id = 1; delete from users; --comment everything else out...
Run Code Online (Sandbox Code Playgroud)
我知道使用SELECT会更容易利用联合来获取您无权查看的数据,但我对这个特定的更新语句很好奇.
我知道这是一个广泛涉及的主题,但在搜索谷歌的PHP的MSSQL注入预防后,我发现几乎没有.
这是我能找到的最接近的答案,但似乎答案是MySQL和不是MSSQL.
我正在使用的PHP代码允许管理员通过表单输入登录到网站以访问后端.此代码是在提交表单后记录管理员的代码:
<?php
session_start();
if($_SERVER['REQUEST_METHOD'] == "POST") {
$conn=mssql_connect('d','a','d');
mssql_select_db('d',$conn);
if(! $conn )
{
die('Could not connect: ' . mssql_get_last_message());
}
$username = ($_POST['username']);
$password = ($_POST['password']);
$result = mssql_query("SELECT * FROM back_end WHERE username='$username' AND
password='$password'");
if(mssql_num_rows($result) > 0) {
$_SESSION['is_logged_in'] = 1;
$_SESSION['backname'] = $username;
}
}
if(!isset($_SESSION['is_logged_in'])) {
header("location:logingbm.php");
echo "<script>alert('Incorrect log-in information!');</script>";
} else {
header("location:../d/index.php");
}
?>
Run Code Online (Sandbox Code Playgroud)
如果有人能给我一些提示我应该放入什么代码以防止恶意注入,我们将不胜感激.感谢您的任何帮助.
我可以在网上找到关于动态创建参数化查询的正确和安全方法的大量信息.但是,此类网站仅讨论where子句的参数化.
那么,sql语句的其他子句呢?请参阅以下内容:
string sql = string.Format(@"
SELECT MIN(TableName) as TableName, {0}
FROM
(
SELECT 'Table A' as TableName, {0}
FROM {1}
UNION ALL
SELECT 'Table B' as TableName, {0}
FROM {2}
) tmp
GROUP BY {0}
HAVING COUNT(*) = 1", columnList, tableA, tableB);
Run Code Online (Sandbox Code Playgroud)
我正在构建一个声明,其中已经参数化了以下内容:
问题:这对sql注入有多么脆弱,可能会造成一些损害?
无论如何,我无法想到恶意黑客可以注入sql,这将导致正确形成的可执行sql.但话说回来,我不是一个SQL专家.
如果我围绕一个sql语句包装解释,即
explain ( [arbitrary sql string] )
我应该能够预防注射create,drop,truncate,delete命令是否正确?
我只是在postgres上尝试过它,它似乎有效,但我不知道是否有一个我忘了的角落案例.
sql-injection ×10
sql ×6
php ×5
c# ×3
mysql ×3
security ×2
coldfusion ×1
database ×1
forms ×1
oracle ×1
pdo ×1
postgresql ×1
sanitization ×1
sanitize ×1
sql-server ×1