我正在尝试提出一个函数,我可以通过我的所有字符串来消毒.因此,从中输出的字符串对于数据库插入是安全的.但是那里有很多过滤功能我不知道应该使用/需要哪些功能.
请帮我填空:
function filterThis($string) {
$string = mysql_real_escape_string($string);
$string = htmlentities($string);
etc...
return $string;
}
Run Code Online (Sandbox Code Playgroud) 我试图想出一个功能,它可以很好地清理某些字符串,以便它们可以安全地在URL中使用(如post slug),也可以安全地用作文件名.例如,当有人上传文件时,我想确保从名称中删除所有危险字符.
到目前为止,我已经提出了以下函数,我希望能解决这个问题并允许外部UTF-8数据.
/**
* Convert a string to the file/URL safe "slug" form
*
* @param string $string the string to clean
* @param bool $is_filename TRUE will allow additional filename characters
* @return string
*/
function sanitize($string = '', $is_filename = FALSE)
{
// Replace all weird characters with dashes
$string = preg_replace('/[^\w\-'. ($is_filename ? '~_\.' : ''). ']+/u', '-', $string);
// Only allow one dash separator at a time (and make string lowercase)
return mb_strtolower(preg_replace('/--+/u', '-', $string), …Run Code Online (Sandbox Code Playgroud) 我意识到参数化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注入攻击的任何特定方法,我很乐意看到它.
我正在寻找一个PHP函数,它将清理一个字符串,并准备用于文件名.谁知道一个方便的?
(我可以写一个,但我担心我会忽略一个角色!)
编辑:用于保存Windows NTFS文件系统上的文件.
我正在尝试将换行符(\n)转换为html br.
根据谷歌集团的讨论,这是我得到的:
myApp.filter('newlines', function () {
return function(text) {
return text.replace(/\n/g, '<br/>');
}
});
Run Code Online (Sandbox Code Playgroud)
那里的讨论还建议在视图中使用以下内容:
{{ dataFromModel | newline | html }}
Run Code Online (Sandbox Code Playgroud)
这似乎是使用旧的html过滤器,而现在我们应该使用该ng-bind-html属性.
无论如何,这会产生一个问题:我不希望原始字符串(dataFromModel)中的任何HTML 呈现为HTML; 只有br的.
例如,给定以下字符串:
虽然7> 5
我仍然不想在这里使用html和东西......
我希望它输出:
While 7 > 5<br>I still don't want html & stuff in here...
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?
我已经安装了 PHP 8.1,并开始测试我的旧项目。FILTER_SANITIZE_STRING我已经像这样使用了过滤器:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
Run Code Online (Sandbox Code Playgroud)
现在我得到这个错误:
已弃用:常量 FILTER_SANITIZE_STRING 已弃用
当我使用时也会发生同样的情况FILTER_SANITIZE_STRIPPED:
已弃用:常量 FILTER_SANITIZE_STRIPPED 已弃用
我可以用什么来代替它?
为了开始这个,我很清楚参数化查询是最好的选择,但我想知道是什么让我在下面提出的策略容易受到攻击.人们坚持认为下面的解决方案不起作用,所以我找一个为什么它不会这样做的例子.
如果在发送到SQL Server之前使用以下转义在代码中构建动态SQL,那么什么样的注入可以打败这个?
string userInput= "N'" + userInput.Replace("'", "''") + "'"
Run Code Online (Sandbox Code Playgroud)
在SQL Server中无法使用"\"转义单引号.
我相信使用Unicode进行SQL走私(此处概述)会被生成的字符串被单引号前面的N标记为Unicode这一事实所阻碍.据我所知,SQL Server没有其他字符集会自动转换为单引号.没有未转义的单引号,我不相信注射是可能的.
我不相信String Truncation也是一个可行的载体.SQL Server肯定不会截断,因为根据microsoft,a的最大大小为nvarchar2GB .在大多数情况下,2 GB的字符串是不可行的,在我的情况下是不可能的.
二阶注入是可能的,但如果可能的话:
我并不是说这比使用参数化查询更好或者替代,但我想知道我概述的内容是如何易受攻击的.有任何想法吗?
我contenteditable在SAFARI/CHROME上有换行问题.当我在contentEditable上按"return" <div>,而不是创建一个<br>(像Firefox),他们创建一个新的<div>:
<div>Something</div>
<div>Something</div>
Run Code Online (Sandbox Code Playgroud)
看起来像(在contentEditable DIV上):
Something
Something
Run Code Online (Sandbox Code Playgroud)
但是在清理(删除<div>)之后,我得到了这个:
SomethingSomething
Run Code Online (Sandbox Code Playgroud)
在Firefox中,contenteditable是:
Something
<br>
Something
Run Code Online (Sandbox Code Playgroud)
卫生处理后看起来一样:
Something
Something
Run Code Online (Sandbox Code Playgroud)
是否有任何解决方案可以跨浏览器"规范化"这个?
我已经在Make a <br>而不是<div> </ div>上找到了这个代码,只需在一个contenteditable上按Enter键
$(function(){
$("#editable")
// make sure br is always the lastChild of contenteditable
.live("keyup mouseup", function(){
if (!this.lastChild || this.lastChild.nodeName.toLowerCase() != "br") {
this.appendChild(document.createChild("br"));
}
})
// use br instead of div div
.live("keypress", function(e){
if (e.which == 13) {
if (window.getSelection) {
var …Run Code Online (Sandbox Code Playgroud) 用户等于不值得信任.永远不要相信不值得信任的用户输入.我明白了.但是,我想知道什么时候消毒输入的最佳时间是.例如,您是否盲目存储用户输入,然后在访问/使用它时对其进行清理,或者您是否立即清理输入然后存储此"已清理"的版本?也许除了这些之外我还有其他一些方法.我更倾向于第一种方法,因为仍然必须谨慎地处理来自用户输入的任何数据,其中"清理的"数据可能仍然在不知不觉中或意外地变得危险.无论哪种方式,人们认为哪种方法最好,原因是什么?
我正在寻找一个简单输入的最佳方法:
echo -n "Enter a string here: "
read -e STRING
Run Code Online (Sandbox Code Playgroud)
通过删除非字母数字字符,降低(大小写)并用下划线替换空格来清理它.
订单有关系吗?这tr是最好/唯一的方法吗?
sanitization ×10
php ×4
filter ×2
security ×2
user-input ×2
angularjs ×1
bash ×1
filenames ×1
html ×1
javascript ×1
jquery ×1
php-8.1 ×1
shell ×1
sql ×1
sql-server ×1
string ×1
t-sql ×1
url ×1
xss ×1